2013-11-28 56 views
0

我想在第一次初始化我的对象时设置属性x,然后调用Object.defineProperty。如果我尝试首先访问foo.x,控制台会告诉我“值未定义”。在Object.defineProperty之前设置对象初始化的属性

var foo = {x:20}; 

Object.defineProperty(foo, "x", { 
    writeable: true, 
    enumerable: true, 
    configurable: true, 
    get: function(){ 
     console.log("Get X value"); 
     return value; 
    }, 
    set: function(newValue){ 
     console.log("Set X value"); 
     value = newValue; 
    } 
}); 
console.log(foo.x); // **Uncaught ReferenceError: value is not defined** 
foo.x = 1; 
console.log(foo.x); 
foo.x = 10; 
console.log(foo.x); 
+0

因为你的getter和setter中的'value'是一个未定义的变量。即使你想以某种方式“引用自己”,你也必须定义它。查看[MDN关于'object.defineProperty()']的示例(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#Creating_a_property)。 – Passerby

+0

谢谢@Passerby。 – yvesb

回答

0

每个属性都有一个'描述符'。如果你是下面介绍这个代码,你会看到这个...

var foo = {x:20}; 

var des = Object.getOwnPropertyDescriptor(foo,'x'); 
console.log('foo.x - descriptor =',des); 

foo.x的描述是这样的:

Object { 
    value  : 20, 
    writable  : true, 
    enumerable : true, 
    configurable : true 
} 

正如你可以看到configurableenumerablewritable已经预先设定为true,所以不需要在defineProperty中这样做。


而且......如果描述符有两种getset它不能有任何valuewritable,反之亦然,因为这会导致这样的错误:

Object.defineProperty(foo,'y',{ 
    value : 5, 
    get  : function(){return 10} 
}); 

会给出错误:

Uncaught TypeError: Invalid property descriptor. Cannot both specify accessors and a value or writable attribute. 

“存取” 是get & set


据我所知,你正在试图获取/设置的foo.x值,但还没有定义什么value呢。喜欢的东西,但不是:

Object.defineProperty(foo, "x", { 
    var value = this; 

所有功能于所有你要对这个错误的方式。看看这段代码,看看它是否有帮助:

var foo = {x:20}; 

Object.defineProperty(foo,'y',{ 
    get : function(){ 
     console.log('Get foo.x'); 
     return this.x; 
    }, 
    set : function(val){ 
     console.log('Set foo.x'); 
     this.x = val; 
    } 
}); 

console.log(foo.x);  // 20 
console.log(foo.y);  // get foo.x (20) 
foo.y = 10;    // set foo.x to 10 
console.log(foo.x);  // 10 
console.log(foo.y);  // 10 
相关问题