【发布时间】:2016-08-06 23:07:18
【问题描述】:
我已经看到通过对象字面量和属性描述符中的 get 和 set 关键字定义的访问器属性。
(来自Speaking 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)中定义的访问器属性和早期模式中定义的访问器属性(对象字面量,直接在对象上的属性描述符)有什么区别吗?
(除了编码风格偏好之外,是否有客观的理由不在构造函数中定义 getter 和 setter?)
【问题讨论】:
标签: javascript oop design-patterns constructor