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);
答案 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
但在我看来,没有任何特别显着的差异, 如果你没有弄乱属性描述符。