我目前正在学习Javascript中的OOP,我遇到了这种困惑
var person={
name:"kevin",
};
Object.defineProperty(person,"name",{
enumerable:false,
configurable:true,
writable:false,
});
delete person.name;
person.name="blue";
alert(person.name);
如您所见,可写设置为false
且可配置设置为true
,反之亦然,它仍将名称从"Kevin"
更改为“蓝色”。
如果writeable为false,为什么名称会改变?请妥善解释
答案 0 :(得分:2)
您的对象中有一个文字属性name
,然后您在其上使用Object.defineProperty
。
这样做
var person = {};
Object.defineProperty(person, "name", {
enumerable: false,
configurable: true,
writable: false
});
// this does nothing
person.name = "kevin";
// see? still undefined
console.log(person.name); // undefined
我认为这是一个更好的方法
// "Person" constructor
function Person(name) {
Object.defineProperty(this, "name", {
configurable: true,
get: function() { return name; },
set: function(newName) { return name = newName; }
});
}
// init with name
var person = new Person("kevin");
// check it
console.log(person.name); // "kevin"
// set a name
person.name = "kevin2";
// check it
console.log(person.name); // "kevin2"
// delete the name property
delete person.name;
// check again
console.log(person.name); // undefined
答案 1 :(得分:1)
由于您将属性设置为configurable:true
,因此您可以将其删除。
致电delete person.name;
后,名称属性消失了。
然后当你致电person.name="blue";
时
新属性是创建的,默认情况下是可写的
答案 2 :(得分:1)
首先创建一个对象,然后在该属性已存在时定义该属性。 你需要有这样的代码才能避免凯文被改变:
var person={};
Object.defineProperty(person,"name",{
value:"kevin",
enumerable:false,
configurable:false,
writable:false,
});
delete person.name;
person.name="blue";
alert(person.name);
答案 3 :(得分:1)
请注意本节底部的注释:
注意步骤10.b允许描述的任何字段不同于 如果当前的[[Configurable]]字段是相应的当前电流字段 真正。这甚至允许改变其财产的[[Value]] [[Writable]]属性为false。这是允许的,因为一个真实的 [[Configurable]]属性允许等效序列 调用[[Writable]]首次设置为true,设置新的[[Value]], 然后[[Writable]]设置为false。
这也适用于能够删除可配置属性,允许您使用不同的值重新定义它。