我想了解如何以及爲什麼在Javascript中有用的原型。在我認爲我知道發生了什麼之後,我偶然發現原型只是一個對象,不能以我認爲的方式被許多對象「共享」。讓我用一個例子說明一下:原型繼承導致共享引用
var SpritePrototype = {
img: null,
pos_x: 0,
pos_y: 0,
draw: function(context2d) {
/*do stuff with the canvas
using "this" to refer to
the object this method is
being called on*/
},
//Some more member functions...
}
從,通常與原型友好的Javascript倡導的「從對象繼承的對象」的概念,我想我可能只是做:
var player = Object.create(SpritePrototype);
但事實證明這種方法存在缺陷,因爲非函數字段將來自SpritePrototype,因爲玩家的原型完全是SpritePrototype。這意味着我無法從該原型創建更多對象,或者無功能字段會混淆在一起。
那麼Object.create有什麼意義,更重要的是,什麼是實現我想要做的正確方法?也就是說,我怎樣才能讓「玩家」得到一個字段的副本,並繼承其原型的功能?
再一次,我有興趣按照他們想要的方式做事。我總是可以手動模擬繼承或完全跳過它。我的問題的關鍵是要了解原型,以及它們如何以及何時有用,特別是在我的具體情況下。
感謝您的澄清。你說的確實是對的。但是我不會說我的例子完全不正確。無論如何,這樣做的不良副作用是因爲img在sprite1和原型中都是這樣,所以屬性最終被創建兩次。 (編輯):或者這是使用原型的預期方式?某種「寫時複製」機制?我從未在其他地方見過這個。 – Setzer22
它不是「不良」的副作用;這是一個理想的選擇。你不想在實例中共享一個可變屬性(除非它是「類級別」,又稱「靜態」屬性)。另一方面,如果你不需要屬性的實例級版本,則不需要保留一個版本。 – 2015-08-08 11:14:22
原型繼承依賴於鏈接。當您基於原型創建對象時,除非您明確聲明新對象的值,否則其所有方法和屬性基本上都是指向原型對象的指針。如果你想實際複製屬性 - 如設置默認對象狀態 - 有不同的方法來做到這一點。 –