JavaScript getter和setter问题

JavaScript getter和setter问题,javascript,prototype,getter-setter,Javascript,Prototype,Getter Setter,以下是我目前正在使用的代码: Object.defineProperty(String.prototype, "testy", { get: function() { return this.string; }, set: function(string) { this.string = string; } }); console.log("tessfef3t".testy()); 在我使用String.prototype.te

以下是我目前正在使用的代码:

Object.defineProperty(String.prototype, "testy", {
    get: function() {
        return this.string;
    },
    set: function(string) {
        this.string = string;
    }
});

console.log("tessfef3t".testy());
在我使用String.prototype.testy=function{}之前,我被告知使用类似于上面代码的东西是更好的方法。我不确定这意味着如何工作,但我还没有得到的代码工作

有人能告诉我如何正确地做我正在做的事情吗

谢谢,testy是一种伪属性,它没有自己的值,但是设置或获取它的值将调用它的set和get函数。您可以像这样使用它:

var foo = new String();

// this invokes the setter and sets foo.string to 5:
foo.testy = 5; 

// this invokes the getter and prints the value of foo.string
console.log(foo.testy); 

// this prints 5, because foo.string has been set by the setter
console.log(foo.string);
编辑:

现在我看到你对你真正想要发生的事情的评论。无法更改字符串对象的值,因为字符串是不可变的。您必须销毁string对象并用新对象替换它,这在对象自身的成员函数中是不可能的。

testy是一种伪属性-它没有自己的值,但设置或获取其值将调用其set和get函数。您可以像这样使用它:

var foo = new String();

// this invokes the setter and sets foo.string to 5:
foo.testy = 5; 

// this invokes the getter and prints the value of foo.string
console.log(foo.testy); 

// this prints 5, because foo.string has been set by the setter
console.log(foo.string);
编辑:


现在我看到你对你真正想要发生的事情的评论。无法更改字符串对象的值,因为字符串是不可变的。您必须销毁string对象并用新对象替换它,这在对象自己的成员函数中是不可能的。

如果您在getter和setter中所做的只是设置一个在其他地方没有使用的属性,并且没有其他处理,那么使用getter和setter您将一无所获,因此您最好使用原始方法。此外,您将无法检索您在字符串上设置的属性。JavaScript中的字符串值是字符串文字(如foo)创建的,并且是唯一一种通常有用的字符串,它不是对象,因此尝试访问属性需要特殊处理:实际上,创建一个临时字符串对象,然后立即丢弃


最后,getter和setter的另一个主要缺点是它们是在ECMAScript 5中指定的,因此只能在相对较新的浏览器中使用。例如,它们没有在IE<9中实现。

如果您在getter和setter中所做的全部工作都是设置一个在其他地方没有使用的属性,并且没有其他处理,那么使用getter和setter您将一无所获,因此您最好使用原始方法。此外,您将无法检索您在字符串上设置的属性。JavaScript中的字符串值是字符串文字(如foo)创建的,并且是唯一一种通常有用的字符串,它不是对象,因此尝试访问属性需要特殊处理:实际上,创建一个临时字符串对象,然后立即丢弃


最后,getter和setter的另一个主要缺点是它们是在ECMAScript 5中指定的,因此只能在相对较新的浏览器中使用。例如,它们没有在IE<9中实现。

这对我来说效果很好:

Object.defineProperty(String.prototype, "byteLength", {
    get: function() {
        var str = "" + this; // Get internal value
        // Compute size in actual bytes vs Unicode characters
        // per http://stackoverflow.com/a/23329386/912236
        for (var b = str.length, c = str.length - 1; 0 <= c; c--) {
            var a = str.charCodeAt(c);
            127 < a && 2047 >= a ? b++ : 2047 < a && 65535 >= a && (b += 2);
            56320 <= a && 57343 >= a && c--;
        }
        return b;
    }
});
>你好,再见 <5


这对我来说很好:

Object.defineProperty(String.prototype, "byteLength", {
    get: function() {
        var str = "" + this; // Get internal value
        // Compute size in actual bytes vs Unicode characters
        // per http://stackoverflow.com/a/23329386/912236
        for (var b = str.length, c = str.length - 1; 0 <= c; c--) {
            var a = str.charCodeAt(c);
            127 < a && 2047 >= a ? b++ : 2047 < a && 65535 >= a && (b += 2);
            56320 <= a && 57343 >= a && c--;
        }
        return b;
    }
});
>你好,再见 <5


您希望tessfef3t.testy是什么?我希望它将tessfef3t记录到控制台,以便在本例中字符串实际上保持不变,但我需要一个示例来说明我做错了什么。您正在尝试调用属性,好像它是一个函数。。。但事实并非如此。此外,这将是临时字符串包装器,因此您将添加一个永远不会真正可用的属性。最后,字符串是不可变的。你不能改变它们。您只能在引用它们的变量/属性上替换它们。您希望tessfef3t.testy是什么?我希望它将tessfef3t记录到控制台,以便在这种情况下字符串实际上保持不变,但我需要一个示例来说明我做错了什么。您试图调用该属性,好像它是一个函数。。。但事实并非如此。此外,这将是临时字符串包装器,因此您将添加一个永远不会真正可用的属性。最后,字符串是不可变的。你不能改变它们。你只能在引用它们的变量/属性上替换它们。啊,我想我现在明白它们是如何工作的了。谢谢你的例子!:唯一的问题是,我的目标是扩展字符串原型,我被告知getter和setter更适合我在这种情况下使用,但我不确定我应该做什么。@Fike哪种方法更好很大程度上取决于您实际想要做什么。我读了你的评论并添加了一个编辑。不能修改字符串对象的值,因为它们是不可变的,但可以返回原始字符串的转换形式的新字符串。因此,您最好不要使用getter/setter方法。啊,我想我现在了解它们是如何工作的了。谢谢你的例子!:唯一的问题是,我的目标是扩展字符串原型,我被告知getter和setter更好
在这种情况下,请允许我使用,但我不确定我应该做什么。@Fike哪种方法更好很大程度上取决于您实际想要做什么。我读了你的评论并添加了一个编辑。不能修改字符串对象的值,因为它们是不可变的,但可以返回原始字符串的转换形式的新字符串。因此,您最好不要使用getter/setter方法。很好的例子!它只演示了get功能,但每个人都可以想象其他功能。。。现有的本机类型是否有一个集合?设置基本类型的想法似乎是错误的。对于HtmleElement很好,但我看不到自己在使用String.language=NorwegianNice示例!它只演示了get功能,但每个人都可以想象其他功能。。。现有的本机类型是否有一个集合?设置基本类型的想法似乎是错误的。对HtmleElement很好,但我不能使用String.language=Norwegian