我已经看到了通过对象常量和属性描述符中的get
andset
关键字定义的访问器属性。
(来自口语JavaScript):
// Object literal
var obj = {
get foo() {
return 'getter';
},
set foo(value) {
console.log('setter: '+value);
}
};
// Property descriptor
var obj = Object.create(
Object.prototype, { // object with property descriptors
foo: { // property descriptor
get: function () {
return 'getter';
},
set: function (value) {
console.log('setter: '+value);
}
}
}
);
(来自Eloquent JavaScript):
// Adding to an object's prototype
Object.defineProperty(TextCell.prototype, "heightProp", {
get: function() { return this.text.length; }
});
但是要说您正在使用构造函数创建对象。我还没有看到在构造函数本身中定义访问器的示例(即,访问器是对象的自己的属性。)
Object.defineProperty
在构造函数中使用似乎有效:
function V(x, y) {
this.x = x;
this.y = y;
// accessor (getter) `length`
Object.defineProperty(this, 'length', {
get: function () { return Math.sqrt(this.x*this.x + this.y*this.y); } // (1)
});
}
上面的构造函数中在(1)中定义的accessor属性和在较早的模式中定义的accessor属性(对象文字,直接在对象上的属性描述符)是否有区别?
(并且出于客观原因,不要在编码风格偏好之外的构造函数中定义getter和setter吗?)
上面的构造函数中在(1)中定义的accessor属性和在较早的模式中定义的accessor属性(对象文字,直接在对象上的属性描述符)是否有区别?
(1)与您之前使用的没有区别defineProperty
。它与顶部(var obj = ...
)的对象初始值设定项之间有区别:该foo
属性是可枚举的,而length
(1)示例中的属性和heightProp
Eloquent JavaScript中的示例中的属性则不是(因为默认值defineProperty
是将其定义为non -enumerable;您可以通过添加来更改它enumerable: true
。
(并且出于客观原因,不要在编码风格偏好之外的构造函数中定义getter和setter吗?)
不。我会注意到,您的特定示例并不能从拥有财产中受益。所以我可能会在上定义它V.prototype
。但是除了使用原型上定义的东西(共享,可重用性,动态性)的通常好处之外,没有特别的理由喜欢它。一次定义它意味着更少的功能对象,但是对象相当便宜。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句