Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用对象原型在JavaScript中设置字段的正确方法_Javascript - Fatal编程技术网

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

使用对象原型在JavaScript中设置字段的正确方法,javascript,Javascript,我正试图找出使用prototype设置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; 但是,这似乎并没有遵循合适的封装协议 或者,我可以这样做: func

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

JavaScript是一种动态语言,如果您严格来说不需要封装这些属性,那么您就不必这样做。因此,第一个例子非常好

否则,如果您需要封装它们,并且您处于符合ES5标准的环境中,则应该使用
get
set
,因为
\uu定义设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置设置

例如:

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;

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

你应该定义你所说的“适当”是什么意思

在上面,您正在向
数据
对象添加
a
b
c
属性,而不是修改
myData.prototype.a
(即
数据[[prototype]].a
)等的值

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

你应该解释一下你的意思,也就是说,你认为上面提到的应该实现什么

[snip
\uuuuu defineGetter\uuuuu
\uuuuu defineGetter\uuuuu
代码]

当我的getter只是返回私有变量的值时,这个方法似乎有些过头了


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

供参考,您通常不需要将某些内容初始化为
null
。如果试图读取值
myData.a
a
尚未初始化,则读取器将得到
undefined
,这通常与
null
一样有效。无论
a
是否初始化为
null
或是否初始化为斜体,if(myData.a)
测试的效果都是一样的。我喜欢初始化变量,但只是出于文档目的。但这只是偏好的问题。顺便说一句,根据Javascript编码惯例,您应该大写构造函数的第一个字母(
MyData
vs.
MyData
),以区分构造函数和过程函数。您是否需要封装?不管有没有,你似乎都不满意。您的属性是公共的还是严格私有的?为什么要将每个(a、b、c)变量指定给相应的“this.”,例如-var a=this.a;你就不能把它当作var a;正如我在评论中所写的那样,我没有给这个.a赋值,而是用相应的
原型
的值设置每个变量。这样,如果您这样做:
alert(new MyData().a)
您将得到
null
,这是
原型中的默认值。否则,您将得到未定义的
,这是不一致的。此外,通过这种方式,如果使用其他默认值(例如字符串)更改
prototype
值,则无需更改构造函数,新值将自动继承。
>  var data = new myData();
>  data.a = 1;
>  data.b = 2;
>  data.c = 3;