使用对象原型在JavaScript中设置字段的正确方法

时间:2012-06-06 00:55:11

标签: javascript

我试图找出使用原型设置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是否正确?即 - 我稍后再设置它们。

2 个答案:

答案 0 :(得分:3)

JavaScript是一种动态语言,如果您严格不需要封装那些您不需要的属性。因此,第一个例子非常好。

否则,如果您需要封装它们,并且您处于符合ES5的环境中,则应使用getset,因为__defineGetter____defineSetter__是已弃用且不是标准(请参阅:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/DefineGetterhttps://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;

请参阅Object.defineProperties

答案 1 :(得分:0)

  

我正在尝试找出设置JavaScript对象字段的正确方法

你应该用“正确的”来定义你的意思。

>  var data = new myData();
>  data.a = 1;
>  data.b = 2;
>  data.c = 3; 

在上文中,您要向a对象添加bcdata属性,而不是修改myData.prototype.a的值(即data[[Prototype]].a)等。

  

但是,这似乎没有遵循适当的封装协议。

你应该解释你的意思,即你认为上述应该达到的目的。

[snip __defineGetter____defineSetter__ code]

  

当我的getter刚刚返回私有变量的值

时,这种方法似乎有点过分了

经典意义上的“私有”变量在ECMAScript中不存在。您可以使用闭包来模拟它们。看看module pattern