可配置和可编写的Javascript

Configurable and Writable Javascript

本文关键字:Javascript 配置      更新时间:2023-09-26

我目前正在学习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"更改为"蓝色"。

如果writible为false,为什么名称会更改?请解释清楚

代码的链接

您的对象中有一个文字属性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

由于您将属性设置为configurable:true,因此可以删除它。

调用delete person.name;后,name属性将消失。

然后当你呼叫person.name="blue";创建一个新属性,默认情况下是可写的

您首先创建一个对象,然后在属性已经存在时定义该属性。为了避免Kevin被更改,你需要有这样的代码:

var person={};
Object.defineProperty(person,"name",{
  value:"kevin",
  enumerable:false,
  configurable:false,
  writable:false,
});
delete person.name;
person.name="blue";
alert(person.name);

Gist

请参阅ECMAScript®语言规范(5.1)的第8.12.9节

注意本节底部的注释:

注:步骤10.b允许Desc的任何字段与如果当前的[[Configuration]]字段为是的。这甚至允许更改其[[Writable]]属性为false。这是允许的,因为[[Configuration]]属性将允许调用其中首先将[[Writable]]设置为true、设置新的[[Value]],然后将[[Writable]]设置为false。

这也适用于删除可配置属性,允许您用不同的值重新定义它。