JavaScript Getters和Setters问题

时间:2012-08-13 13:02:41

标签: 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.testy = function {}之前,我被告知使用类似于上面代码的东西是更好的方法。我不确定这是如何工作的,但我还没有那个代码可以工作。

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

由于

3 个答案:

答案 0 :(得分:2)

testy是一种“虚假”属性 - 它没有自己的价值,但设置或获取其值将调用其setget函数。您可以像使用它一样使用它:

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);

修改

现在我看到你对你实际想要发生什么的评论。不可能改变字符串对象的值,因为字符串是不可变的。您必须销毁字符串对象并将其替换为新对象,这在对象自己的成员函数中是不可能的。

答案 1 :(得分:1)

如果你在getter和setter中所做的一切都设置了一个在其他地方没有使用的属性而且没有其他处理,那么你就可以通过使用getter和setter来获得任何好处,这样你最好采用原始方法。此外,无论如何,您将无法检索您在字符串上设置的属性。 JavaScript中的字符串值(这是"foo"创建的字符串文字,并且是唯一一种通常有用的字符串)不是对象,因此尝试访问属性需要特殊处理:实际上是临时的之后立即创建String对象并将其丢弃。

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

答案 2 :(得分:1)

这对我来说很好:

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;
    }
});
  

> "Hello".byteLength
  < 5