我试图找出使用原型设置JavaScript对象字段的正确方法。
我可以使用以下内容:
function myData() {};
myData.prototype.a = null;
myData.prototype.b = null;
myData.prototype.c = null;
var data = new myData();
data.a = 1;
data.b = 2;
data.c = 3;
但是,这似乎没有遵循适当的封装协议。
或者,我可以这样做:
function myData() {
this._a = null;
this._b = null;
this._c = null;
};
myData.prototype.__defineGetter__("a", function() {
return this._a;
});
myData.prototype.__defineSetter__("a", function(val) {
this._a = val;
});
当我的getter只是返回私有变量的值并且没有对它做任何事情时,这种方法似乎有点过分了。
另外,如果我之前没有这些值,那么在构造函数中将值设置为null是否正确?即 - 我稍后再设置它们。
答案 0 :(得分:3)
JavaScript是一种动态语言,如果您严格不需要封装那些您不需要的属性。因此,第一个例子非常好。
否则,如果您需要封装它们,并且您处于符合ES5的环境中,则应使用get
和set
,因为__defineGetter__
和__defineSetter__
是已弃用且不是标准(请参阅:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/DefineGetter和https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Working_with_Objects#Defining_getters_and_setters)
一个例子:
function MyData() {
// set to the prototype's value
var a = this.a;
var b = this.b;
var c = this.c;
Object.defineProperties(this, {
"a": {
get : function(){ return a; },
set : function(value) { a = value }
},
"b": {
get : function(){ return b; },
set : function(value) { b = value }
},
"c": {
get : function(){ return c; },
set : function(value) { c = value }
}
});
};
MyData.prototype.a = null;
MyData.prototype.b = null;
MyData.prototype.c = null;
答案 1 :(得分:0)
我正在尝试找出设置JavaScript对象字段的正确方法
你应该用“正确的”来定义你的意思。
> var data = new myData();
> data.a = 1;
> data.b = 2;
> data.c = 3;
在上文中,您要向a
对象添加b
,c
和data
属性,而不是修改myData.prototype.a
的值(即data[[Prototype]].a
)等。
但是,这似乎没有遵循适当的封装协议。
你应该解释你的意思,即你认为上述应该达到的目的。
[snip __defineGetter__
,__defineSetter__
code]
当我的getter刚刚返回私有变量的值
时,这种方法似乎有点过分了
经典意义上的“私有”变量在ECMAScript中不存在。您可以使用闭包来模拟它们。看看module pattern。