JavaScript繼承模式粗探_javascript技巧

來源:互聯網
上載者:User

真正意義上來說Javascript並不是一門物件導向的語言,沒有提供傳統的繼承方式,但是它提供了一種原型繼承的方式,利用自身提供的原型屬性來實現繼承。Javascript原型繼承是一個被說爛掉了的話題,但是自己對於這個問題一直沒有徹底理解,今天花了點時間又看了一遍《Javascript模式》中關於原型實現繼承的幾種方法,下面來談談JS中比較簡單的繼承方法,如果大家有不同意見,歡迎建議。

最基礎的原型鏈繼承在這裡就不複述了,主要講一下其他的繼承模式。

1.借用建構函式繼承

function Father (name) {this.name=name;}function Son (name) {Father.call(this,name); //在子類型中調用超類型的建構函式this.age=15;}var me=new Son("Su"); 

好處:可以為子類型傳遞參數,如圖中的name屬性。

壞處:1.方法在建構函式中定義,無法複用。2.超類型原型中定義的方法對子類型是不可見的。

2.組合繼承(綜合原型鏈與建構函式)

//超類型建構函式function Father (name) {this.name=name;this.famMember=[];}//超類型建構函式原型方法Father.prototype.sayName=function () {alert(this.name);}//子類型建構函式function Son (name,age) {Father.call(this,name); //建構函式方法this.age=age;}Son.prototype=new Father(); //重寫子類型原型對象Son.prototype.constructor=Son; //重寫建構函式屬性指向子類型Son.prototype.sayAge=function () {alert(this.age);} //重寫原型對象後再加入方法var me=new Son("Su",15);me.famMember.push("dad","mom"); //子類型可以調用超類型建構函式內的方法var he=new Son("Li",14);alert(he.famMember); // [] 

好處:不同的子類既可以擁有自己的屬性,也可以使用相同的方法。

壞處:這種方法需要調用2次超類型的建構函式,同名的屬性方法會被覆蓋一次。

3.原型式繼承 (類似Object.create())

function object (o) {function F () {}F.prototype=o;return new F();}var obj={}; //將obj對象傳入作為新對象的原型。var me=object(obj); 

使用這種方法繼承需要有一個對象作為原型對象,所以所有繼承其的子類型的屬性方法都是共用的。

ES5通過新增Object.creatr()方法規範了原型式繼承。

4.寄生式繼承 (可以設定私人方法的原型式繼承)

function object (o) {function F () {}F.prototype=o;return new F();}var obj={}; //將obj對象傳入作為新對象的原型。到這裡都與原型式繼承相同function creObj(o) {  var clone=object(obj);  clone.sayHi=function () {    alert("Hi");  };return clone; }var me=creObj(obj); 

好處:這種方式彌補了原型式繼承只有公有屬性方法的缺陷,使子類型能有私人屬性方法。

5.寄生組合式繼承

function inherit (father,son) {var pro=Object(father.prototype); //建立超類型原型對象的副本pro.constructor=son;son.prototype=pro;           //將副本作為子類型的原型對象} 

本方法用於彌補組合繼承中屬性方法覆蓋的問題。

用上圖代碼代替組合繼承中 Son.prototype=new Father(); 這段代碼。這樣只需調用一次父類型的建構函式,避免了創造多餘不必要的屬性方法,並且保持了原型鏈不改變,是一種理想的參考型別繼承方法。

關於js繼承模式先粗略給大家介紹這麼多,相信對大家有所協助,更多資訊請繼續關注云棲社區網站。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.