2015-07-21 87 views
1

所以我來自Python並試圖圍繞原型是什麼。無論如何,我可以得到一個原型的Pythonic描述?這種聽起來像一個描述符有一個嬰兒init。另外,我聽說Prototype在使用DOM時往往會產生負面影響。真的嗎?如果是這樣,爲什麼?謝謝,我一直在瀏覽大量的文章,而Prototype在這一點上對我來說毫無意義!關於原型的細節

+0

我想_a原型的pythonic描述應該是['prototype.py'](https://github.com/airportyh/prototype.py),但是這是原型到_Python_的實現。 _古典語言_以與古典_Class_不同的方式進行代碼重用,這不是一個簡單的翻譯。 –

+0

@PaulS。謝謝,prototype.py的一個快速谷歌帶我到一個非常有用的網站,它聽起來像一個並不遙遠。糾正我,如果我錯了,但你可以定義變量和設置默認值(如init)。此外,您可以添加類似於部分的自定義函數或使用裝飾器或覆蓋內置函數(如print)(類似於描述符覆蓋__getattr__的能力)? –

+0

我也試圖在這方面找到一些見解,並且偶然發現了這篇文章http://aaditmshah.github.io/why-prototypal-inheritance-matters/。希望能幫助到你。 – bbill

回答

1

在Javascript中,很像Python,一切都是對象。這包括功能。

雖然Javascript沒有類。但是,您可以使用函數來模擬類的行爲。


所有功能都有一個名爲prototype的屬性。 如果你說:

myInstance = new myFunction() 

myFunction運行。 (所以它就像一個構造函數)並且結果存儲在myInstance中。這裏沒什麼瘋狂的,但new關鍵字所做的是將prototype屬性從myFunction複製到myInstance的內部屬性。該文檔在文檔中被稱爲[[prototype]],您可以在一些現代瀏覽器中將其引用爲__proto____proto__雖然沒有標準化,所以不鼓勵使用它。

如果您需要獲取物體的[[prototype]],而不是使用__proto__,請使用Object.getProtoTypeOf(myInstance)

MyClass.prototype == Object.getPrototypeOf(myInstance) //true 

當調用對象的方法,如果對象沒有該方法,使用Javascript將查找其[[prototype]]財產。它將繼續搜索原型(又名繼承)鏈,直到它達到Object

因此,作爲一個例子:

function MyClass() { 
    this.prop ="hello" 

    //Javascript implicitly returns `this` when the function is invoked using "new" 
} 

MyClass.prototype.instanceMethodOne = function() { 
    console.log(this.prop); 
} 

var myInstance = new MyClass(); 

myInsance.instanceMethodOne(); //"hello" 

在上述例子中,myInstance將有一個稱爲prop屬性。但它不會有名爲instanceMethodOne的房產。此屬性已添加到MyClass的原型對象。但是,對該對象的引用被複制到myInstance[[prototype]](又名)__proto__屬性中,因此它是可訪問的。

你現在有一種情況,所有的實例都有自己的狀態,它是在構造函數中創建的(只是一個普通函數),但是它們共享添加到函數原型屬性的狀態。這就是你如何在Javascript中獲得「類」。

+0

將這些事情稱爲類並不好,稱它們爲_Constructors_ –

+0

查看構造函數來解釋JavaScript原型......也許不是最好的主意。 –

+0

@Kyll什麼是解釋它們的更好方法?關於對象藍圖的一些過於複雜的隱喻? ;)請隨時添加您自己的答案。我會高興地投票。這只是我解釋它的方式,它在技術上是準確的。 – LukeP