2012-06-26 112 views
3

我正在學習JS原型。瞭解JavaScript原型

如果我從一些其它的構造(B)的實例設置的原型構造(A)的是,例如(的B)將介紹在共享屬性?

實施例1對

function A(){ 
    var private = ''; 

    this.getPrivate = function(){ 
     return private 
    }; 

    this.setPrivate = function(_private){ 
     private = _private; 
    }; 
} 

function B(){}; 

B.prototype = new A(); 

b1 = new B(); 
b2 = new B(); 

b1.setPrivate(new Date()); 
b2.getPrivate(); // Here `private` is behaving as singleton property. Why? 

實施例2

function A(){ 
    var private = ''; 
} 

A.prototype.getPrivate = function(){ 
    return this.private 
}; 

A.prototype.setPrivate = function(_private){ 
    this.private = _private; 
}; 

function B(){}; 

B.prototype = new A(); 

b1 = new B(); 
b2 = new B(); 

b1.setPrivate(new Date()); 
b2.getPrivate(); // This time private is not singleton property. 

我同時玩它發現原型的這個新的方面。

  • 在示例1中,爲什麼private屬性在B的不同實例之間共享?
  • 在例2中,爲什麼private屬性在這兩種情況下獨立存在?但是原始屬性不變,但getter/setter是通過原型定義的。
  • 可以將示例1視爲單例屬性的實現嗎?
  • 原型通過實例和原型通過原型,有什麼區別?例如
    B.prototype = new A();
    B.prototype = (new A()).constructor.prototype
  • 什麼是原型的完整的祕密?

回答

1
  1. 因爲您正在繼承鎖定到特定關閉的特定實例。該數據歸 所有,而不是對象。對象的變量和屬性之間存在巨大差異。

  2. var private這裏沒有用的。當你setPrivate()該屬性是在那個時候創建​​的。

  3. 不,它只是偶然的,因爲關閉和對象模型之間存在誤解。你可以用更簡潔更清晰的方式做同樣的 :使用簡單的對象字面。

  4. 不同的是,在第一個你會得到一個新的對象,其中在第二個你必須A.prototype === B.prototype如此調整,因爲它們引用同一個對象 人會修改其他。

  5. 對象從其他對象繼承

這裏有一個很好的資源https://developer.mozilla.org/en/JavaScript/Guide/Details_of_the_Object_Model

+0

是的,一個簡單的對象文字可以是單身對象的故意選擇。但是部分單例屬性可以用這種方式實現。我有一個場景,其中不同的fx對象擁有獨立的配置,但共享他們操作的dom元素的參考。 –

+0

@ShuaibNawaz我不熟悉* partial * singleton的概念:P – Esailija

+0

我不打算推​​出一個新的術語。 :D我的意思是在實例中定義幾個共享屬性,它適用於我的場景,我不清楚它的概念。不管怎樣,謝謝你。 –

1

原型的祕密(這也解釋了這一切)是B股相同的原型,即原型實例不是拷貝到B新實例。當你火B任何實例的原型函數,你實際上是在運行相同功能的所有時間。這就是爲什麼「私人」變量被複制(實際上它不被複制,你只是一直引用相同的變量)。除非關鍵字this指向函數的當前「持有者」,否則「非私有」變量表現相同。這就是爲什麼在原型中調用this使我們對原型方法實際上是對象方法的錯覺。不是這樣。通過實例

原型被認爲是不好的做法,因爲情況可能隨他們被稱爲,當你原型有或多或少的性能。原型主要是通過字面對象創建來擴展其他對象的原型。

最後:在一些SENCE原型可以被解釋爲單。

1

在例1,爲什麼私人財產受到不同實例B的 之間共享?

是的,他們做

在示例2,爲什麼私有財產具有兩個 情況下獨立存在?然而,原始屬性保持不變,但是通過原型定義了getter/setter。

因爲每個實例都是獨立於其他實例的。如果這不是你想用的對象字面值表示法來創建你的類。

可以將示例1視爲單例屬性的實現嗎?

否,因爲singleton總是返回相同的對象實例。這涉及到你的第二個問題,每個實例都是獨立的。你可以從第一個例子中創建該類的許多實例。要創建單身人士,存在單身人士或模塊模式它使用自我調用功能與分組運算符例如包裝功能在()

通過實例,並通過樣機原型樣機,有什麼 區別?例如

With constructor,確保您的子類構造函數和父類之間沒有混淆。擴展父類時是同樣的概念,在子類中你構造了父類的子類的構造函數。

什麼是原型的完整祕密?

在各種JS忍者博客上閱讀好文章。我愛:

這裏是很好的文章:

1

在例1中,使用的是封閉範圍指一個私人。由於A僅實例化一次,所以它的一個實例被定義。

在示例2中,this.private沒有引用函數A中的private實例。實際上,由於使用了「this」這個詞,它指的是對象的「this」。因此,根據函數,this.private或者意味着b1.private或者b2.private。在示例2中,函數A中定義的私有對關閉範圍是丟失的,就好像它從未定義過一樣。

+0

很好的解釋 –