2014-09-04 23 views
0

關於delete關鍵字如何在JavaScript中工作,我有點困惑。刪除實例本身與創建它的構造函數的操作

我有一個ParentPerson的構造函數。我實例化了person1並將其name屬性設置爲person1.name = "newPerson"。如果我運行以下代碼:

delete Person.name 

它刪除屬性。但是,person1.name仍然存在,console.log(person1.name)返回"newPerson"。相反,如果我

delete person1.name 

Parent對象name屬性,而不是所謂的和採取行動。

在第一種情況下,delete不會從給定實例中刪除屬性,而會從Person構造函數中刪除屬性。在第二種情況下,delete將從Person構造函數和從中創建的所有實例中刪除屬性。我知道delete不會影響JavaScript中的變量,例如,person1;雖然在這種情況下delete功能如何?

function Person(){ 
    this.name = "person"; 
} 
function Parent(){ 
    this.name = "parent"; 
} 
Person.prototype = new Parent(); 

var person1 = new Person(); 
person1.name = "newPerson"; 

delete (Person.name); 
console.log(person1.name); 
+1

'Person.name'與'Person.prototype.name'不一樣。 – Barmar 2014-09-04 00:36:57

+0

你究竟在做什麼?你想刪除什麼? – jfriend00 2014-09-04 00:41:23

+0

只是想看看刪除鍵如何影響函數構造函數和從它創建的實例 – 2014-09-04 01:10:27

回答

3

通過執行delete (Person.name);您試圖刪除存在(這是不可配置的屬性)功能Personname屬性。它與其實例上的name屬性無關。 如果你做console.log(delete (Person.name));你會看到false in non-strict mode和它will throw an error in strict mode。而delete operator的唯一目的是從對象中刪除屬性。是的函數可以有屬性例如: -

function Person(){ 
    this.name='person'; //Available on the instance of Person or on any of the prototype chain it belongs to 
} 

Person.refName = "something"; //This is not on the instance of the Person 

,你可以刪除: -

delete (Person.refName) 

刪除只在一個對象的屬性有效。它對變量或函數名稱沒有影響。

如果你想刪除從對象的屬性剛剛從實例中刪除,例如: - delete person1.name

2

javascript中的delete運算符主要用於從對象中刪除屬性。你不要在javascript中刪除對象。因爲這是一種垃圾收集語言,所以釋放對象的方式是刪除對它的所有引用(例如,所有對它有指針的變量)。當你刪除了對它的所有引用時,垃圾收集器將釋放該對象。

通過將任何對象設置爲null(或任何其他值)或等待變量超出範圍,您可以清除對任何對象的引用。

在你的具體的例子:

delete Person.name 

因爲Person是一個函數對象和函數對象沒有屬性命名name沒有做任何事情。 name看起來像您詢問的是Person對象的實例,該對象存儲在您的person1變量中。所以,你可以這樣

delete person1.name 

如果你真的想刪除該特定對象的屬性。


而且,你對從prototype刪除事情沒有意義,我的意見。在任何一個代碼案例中,原型都不會被刪除。

+0

這似乎與他的問題沒有任何關係。他並沒有試圖刪除這個實例,他只是對實例中'name'屬性和原型鏈之間的關係感到困惑。 – Barmar 2014-09-04 00:36:23

+0

@Barmar - 第一部分是背景 - 我已經填寫了更具體的內容,我正在寫更多。目前還不清楚OP究竟在嘗試做些什麼,我試圖解釋一般的'delete'操作符,以及它如何應用於OP所具有的對象。 – jfriend00 2014-09-04 00:38:42

+0

Person.hasOwnProperty(name)返回false,但person1.hasOwnProperty(name)返回true。爲什麼Person構造函數中沒有name屬性?如果Person構造函數中沒有名稱屬性,那麼this.name ='person'語句甚至意味着什麼?thanks.i對於面向對象的JS概念來說相當新穎。我試圖清除一些令人困惑的術語:) – 2014-09-04 01:03:55

相關問題