Object.defineProperty和对象属性文字之间的区别

时间:2014-11-13 22:23:39

标签: javascript javascript-objects

person和person2的name属性之间有什么区别(如果有的话)?

var person = function(){
    var _name;
    var _person = {};

    Object.defineProperties(_person, {
        name: {
            get: function(){ return _name },
            set: function(n) { _name = n; },
            enumerable: true,
            configurable: true
        }
    });

    return _person;
}();
person.name='john';
console.log(person.name);

function Person2()
{
    this.name = undefined;
}
var person2 = new Person2();
person2.name = 'john';
console.log(person2.name);

2 个答案:

答案 0 :(得分:1)

defineProperties只是让您对定义的属性有更多的权力。如果使用点符号来定义属性,就像使用Person2一样,那么该属性在默认情况下是可写的,可删除的和可枚举的。

您保留了Person1的默认值,其中一个是writeable: false,因此除非您明确使用setter,否则无法重新分配属性。换句话说,您将无法使用点符号来更改该属性。

通常情况下并不需要这种行为,所以我要小心使用它,因为它可能会导致意想不到的结果。

答案 1 :(得分:1)

实际差异?良好:

Object.getOwnPropertyDescriptor(person, 'name') 

将返回一个不等于

的值
Object.getOwnPropertyDescriptor(person2, 'name') 

这两个函数调用也有不同的效果:

Object.defineProperties(person, {name: {set: undefined}});
person.name; // john
Object.defineProperties(person2, {name: {set: undefined}});
person2.name; // undefined

但在我看来,没有任何特别显着的差异, 如果你没有弄乱属性描述符。