为什么属性无法从原型上定义的setter中获取

时间:2016-10-06 10:35:27

标签: javascript

我有这段代码:

function Test2() {
  this.data = 1;
  this.unaccesible = 7;
}

Object.defineProperty(Test2.prototype, "data", {
  get: function() {
    return this.data;
  },
  set: function(nv) {
    // here this.unaccesible is undefined - why?
    console.log(this.unaccesible);
  }
});

var o = new Test2();
o.data = 2;

为什么属性在setter中不可用?

console.log(this.unaccesible);

3 个答案:

答案 0 :(得分:2)

因为您在原型上定义了属性,而不是Test2的实例。 this.data仅可访问,因为您正在定义属性data。它与Test2的构造函数中设置的data不同。

答案 1 :(得分:1)

当创建Test2的实例并执行第2行this.data = 1时,这是定义的,并且它具有原型,其具有"数据"属性但实例本身没有"数据"然而。这就是为什么调用原型的数据属性设置器方法并且它在this.unaccesible = 7之前发生的原因。这就是为什么this.unaccesible在这一点上未定义的原因

答案 2 :(得分:0)

您需要为每个变量创建单独的Object.defineProperty。 有关注释的代码示例,请查看以下小提琴。希望这能解答您的疑问。

JSfiddle example for the problem

或查看下面的相同代码

            function Test2() {
              this.data = 1;
              this.unaccesible = 5;
            }

            Object.defineProperty(Test2.prototype, "unaccesible", {
              get: function() {
                return this.data;
              },
              set: function(nv) {
                // here this.unaccesible is undefined - why?
                // You cannot access "unaccesible" directly as the parameter for the
                // setter function is nv.
                var test = nv;
                alert("Unaccessible:" + test);
              }
            });
            // Use object.defineProperty for each variable as follows to set data value
            Object.defineProperty(Test2.prototype, "data", {
              get: function() {
                return this.data;
              },
              set: function(nv) {
                // here this.unaccesible is undefined - why?
                // You cannot access "unaccesible" directly as the parameter for the
                // setter function is nv.
                var test = nv;
                alert("Data:" + test);
              }
            });

            var o = new Test2();
            //This sets the value of unaccesible to 2 after the intial value 5 is stored.
            o.unaccesible = 6;
            //This sets the value of data to 2 after the intial value 1 is stored.
            // This is executed after unaccesible
            o.data = 2;