可配置和可写的Javascript

时间:2014-08-28 18:42:15

标签: javascript

我目前正在学习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,为什么名称会改变?请妥善解释

Link for the code

4 个答案:

答案 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);

Gist

答案 3 :(得分:1)

请参阅Section 8.12.9

ECMAScript® Language Specification (5.1)

请注意本节底部的注释:

  

注意步骤10.b允许描述的任何字段不同于   如果当前的[[Configurable]]字段是相应的当前电流字段   真正。这甚至允许改变其财产的[[Value]]   [[Writable]]属性为false。这是允许的,因为一个真实的   [[Configurable]]属性允许等效序列   调用[[Writable]]首次设置为true,设置新的[[Value]],   然后[[Writable]]设置为false。

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