這篇文章帶給大家的內容是關於js原型和原型鏈的知識介紹(附程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
先宣告一個建構子
function People(name,age){ this.name = name; this.age = age; }
把類別的方法寫在建構子原型物件中,子類別就不能再透過呼叫父類別建構子來繼承方法(屬性還是可以繼承)
// 给People的原型添加方法 People.prototype.speak = function(){ console.log("我是"+this.name); } // 创建子类继承People function Man(name,age,huzi){ People.call(this,name,age); this.huzi = huzi; }
(People和Man的屬性和方法都可以輸出和呼叫檢視,程式碼裡就不展示測試程式碼了)
這時候怎麼讓Man去繼承People的方法?
Man.prototype = People.prototype; Man.prototype.smoke = function(){ console.log("抽烟"); }
然而這樣並不對!不能直接把子類的prototype指向父類的prototype,這樣會導致兩個構造函數共用一個prototype,其中的方法父類子類的對像都可訪問,而正確的情況應該是子類別可以存取父類別的方法,而父類別不能存取子類別的方法
js物件的原型也是物件,所以js原型也有原型.
當存取一個對象的方法時,如果物件中存在則直接存取,如果不存在則在物件的原型中尋找,有則存取,沒有則在原型的原型中尋找,如果還沒有則繼續網路上尋找,直到找到Object位置
Object是一個類別(建構子),這個類別的物件的原型沒有原型
js物件的原型,與js原型的原型組成的鍊式結構叫做js原型鏈
子類別要繼承父類別的方法,則需要把子類別的建構子類別的prototype物件的原型(__proto__)設定為父類別建構子的prototype
那麼就是這麼寫:
Man.prototype.__proto__ = People.prototype;
這樣寫可以,但官方給的有個更好標準的寫法(這樣寫並沒錯)
// Object.create用于指定原型创建一个对象(空对象) Man.prototype = Object.create(People.prototype); Man.prototype.smoke = function(){ console.log("抽烟"); }
子類繼承父類時,除了可以擴展新的方法,還可以重寫父類別已有的方法,當使用子類別物件呼叫重寫的方法,會執行子類別自己的方法
Man.prototype.speak = function(){ console.log("我是男性"); }
相關推薦:
學習javascript物件導向 理解javascript原型與原型鏈_javascript技巧
以上是js原型物件和原型鏈的分析介紹(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!