在Object.defineProperty之前设置对象初始化内的属性

时间:2013-11-28 11:28:29

标签: javascript defineproperty

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

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);

1 个答案:

答案 0 :(得分: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,则CAN' T有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