【问题标题】:Set property within object initialisation before Object.defineProperty在 Object.defineProperty 之前在对象初始化中设置属性
【发布时间】:2013-11-28 11:28:29
【问题描述】:

我想在第一次初始化对象时设置属性 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);

【问题讨论】:

标签: javascript defineproperty


【解决方案1】:

每个属性都有一个“描述符”。如果你要在下面介绍这段代码,你会看到这个......

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

【讨论】:

    猜你喜欢
    • 2021-01-22
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 2012-12-15
    • 2013-10-28
    • 1970-01-01
    相关资源
    最近更新 更多