2014-08-28 44 views
0

我目前走的是曲線在Javascript學習OOP和我來到這個混亂配置和可寫的Javascript

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"更改爲「藍色」。

如果可寫是假的,爲什麼名稱會更改?請請解釋清楚

Link for the code

回答

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 
+0

這隻適用,因爲你刪除了原始代碼 – 2014-08-28 19:00:06

+0

@YonatanNaor,nope中的'delete person.name;'這一行。 – naomik 2014-08-28 19:04:21

+0

你說得對,對不起 – 2014-08-28 21:19:13

1

既然你設置爲configurable:true你可以刪除它的屬性。

在您致電delete person.name;後,name屬性消失。

然後當你調用person.name="blue"; 一個新特性是創建默認情況下是

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

+0

這段代碼也在JSBin中測試過。不要理解爲什麼在第一次回答時沒有將其標記爲答案。 – V31 2014-08-28 19:01:29

1

ECMAScript® Language Specification (5.1)

通知Section 8.12.9的注意在這個底部部分:

注意:如果當前的[[Configurable]]字段爲 ,則步驟10.b允許Desc的任何字段與 的當前電流字段不同。這甚至允許更改 [[Writable]]屬性爲false的屬性的[[Value]]。這是允許的,因爲真正的 [[Configurable]]屬性將允許調用等效的 調用,首先將[[Writable]]設置爲true,設置新的[[Value]], ,然後[[Writable] ]設置爲false。

這也適用於能夠刪除可配置的屬性,允許您用不同的值重新定義它。