JS:构造函数中的对象属性更改

时间:2017-09-16 15:41:56

标签: javascript node.js properties ecmascript-6

我有这段代码:

class Obj {
    constructor() {
        this.foo = "foo";
    }
}

Object.defineProperty(Obj.prototype,'foo',{enumerable:false,writable:true});
Object.defineProperty(Obj,'foo',{enumerable:false,writable:true});

let obj = new Obj();

console.log(obj);

我的输出是:

Obj { foo: 'foo' }

问题是,我将foo的enumerable属性定义为false。但是当我在构造中使用'this.foo'时,属性会改变它。

我知道我可以加入构造函数:

Object.defineProperty(this,'foo',{enumerable:false,writable:true});

我的新输出正确抛出:

Obj {}

但是,我的问题是,是否可以更改foo的属性,而不是在构造函数中更改它?

谢谢!

1 个答案:

答案 0 :(得分:1)

  

我的问题是,是否可以更改foo的属性,而不是在构造函数中更改它?

答案简短:不。

那是因为每次调用构造函数并执行this.foo = "foo";时,您都会创建一个 new 属性。您在Obj.propertyObj上创建的属性实际上完全不相关。它们是完全独立的属性,在不同的对象上定义,而不是this

只需更密切地关注Objobj

enter image description here

您可以看到三个不同的foo属性,我注意到哪些操作会创建它们。希望这更清楚地说明为什么设置Obj.fooObj.prototype.foo的可枚举性对obj.foo没有影响。

this.foo = "foo";创建一个可枚举的属性。如果您不希望它是可枚举的,那么您必须使用Object.defineProperty创建它。同样,您在ObjObj.prototype上创建的属性与您在this上创建的属性无关。