[英]JavaScript Getters and Setters issue
这是我目前正在使用的代码:
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);
编辑:
现在,我看到您对您实际想要发生的事情的评论。 由于字符串是不可变的,因此无法更改字符串对象的值。 您必须销毁字符串对象,然后将其替换为新对象,这在对象自己的成员函数中是不可能的。
如果您在getter和setter中所做的所有事情都是设置一个未在其他地方使用的属性,并且没有其他处理,那么使用getter和setter不会获得任何好处,因此您最好使用原始方法。 此外,无论如何您将无法检索在字符串上设置的属性。 JavaScript中的字符串值(这是字符串文字(例如"foo"
创建的,并且是唯一一种通常有用的字符串)不是对象,因此尝试访问属性需要特殊处理:有效地是一个临时String
对象创建后立即丢弃。
最后,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;
}
});
> "Hello".byteLength
< 5
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.