摘要:使用最多的繼承模式是組合繼承,這種模式使用原型鏈繼承共享的屬性和方法,而借用構造函數繼承實例屬性。原型式繼承,可以在不必預先定義構造函數的情況下實現繼承,其本質是執行給定對象的淺復制。
1、原型鏈實現繼承
function SuperType() { this.property = true; } SuperType.prototype.getSuperValue = function() { return this.property; }; function SubType() { this.subproperty = false; } //繼承了SuperType SubType.prototype = new SuperType(); SubType.prototype.getSubValue = function() { return this.subproperty; }; var instance = new SubType(); alert(instance.getSuperValue()); //true2、借用構造函數
原型鏈的問題是對象實例共享所有繼承的屬性和方法,因此不適宜多帶帶使用。解決這個問題的技術是借用構造函數,即在子類型構造函數的內部調用超類型構造函數。這樣就可以做到每個實例都具有自己的屬性,同時還能保證只使用構造函數模式來定義類型。
function SuperType() { this.colors = ["red", "blue", "green"]; } function SubType(){ //繼承了SuperType, SuperType.call(this);//在子類型構造函數的內部調用超類型構造函數 } var instance1 = new SubType(); instance1.colors.push("black"); alert(instance1.colors); //"red,blue,green,black" var instance2 = new SuperType(); alert(instance2.colors); //"red,blue,green"3、組合繼承
思想:在子類型構造函數的內部調用超類型構造函數。使用最多的繼承模式是組合繼承,這種模式使用原型鏈繼承共享的屬性和方法,而借用構造函數繼承實例屬性。
function SuperType(name) { this.name = name; this.color = ["red","blue","green"]; } SuperType.prototype.sayName = function() { alert(this.name); }; function SubType(name ,age) { //繼承屬性 SuperType.call(this,name);//在子類型構造函數的內部調用超類型構造函數 this.age = age; } //繼承方法 SubType.prototype = new SuperType(); SubType.prototype.constructor = SubType; //指向構造函數 SubType.prototype.sayAge = function() { alert(this.age); }; var instance1 = new SubType("Nicholas", 29); instance1.colors.push("black"); alert(instance1.colors); //"red,blue,green,black" instance1.sayName(); //"Nicholas" instance1.sayAge(); //29 var instance2 = new SubType("Greg" ,27); alert(instance2.colors); //"red,blue,green" instance2.sayName(); //"Greg" instance2.sayAge(); //274、原型式繼承
(1)借助原型可以基于已有的對象創建新對象,同時還不必因此創建自定義類型
(2)在object()函數內部,先創建了一個臨時性的構造函數,然后將傳入的對象作為這個構造函數的原型,最后返回這個臨時類型的一個新實例。
(3)原型式繼承,可以在不必預先定義構造函數的情況下實現繼承,其本質是執行給定對象的淺復制。而復制的副本還可以得到進一步的改造。
var person = { name : "Nicholas", friends : ["Shelby", "Court", "Van"] }; var anotherPerson = object(perosn); anotherPerson.name = "Greg"; anotherPerson.friends.push("Rob"); var yetAbotherPerson = object(perosn); yetAbotherPerson.name = "Linda"; yetAbotherPerson.firends.push("Barbie"); alert(person.friends); //"Shelby, Court, Van, Greg, Linda"5、寄生式繼承
與原型式繼承非常相似,也是基于某個對象或某些信息創建一個對象,然后增強對象,最后返回對象。為了解決組合繼承模式由于多次調用超類型函數而導致的低效率問題,可以將這個模式與組合繼承一起使用。
function creatAnother(original) { var clone = object(original); //通過調用函數創建一個新對象 clone.sayHi = function() { //以某種方式來增強這個對象 alert("hi"); }; return clone; //返回這個對象 } var person = { name : "Nicholas", friends : ["Shelby", "Court", "Van"] }; var anotherPerson = creatAnother(person); anotherPerson.sayHi(); //"hi"6、寄生組合式繼承
(1)集寄生式繼承與組合繼承的優點于一身,是實現基于類型繼承的最有效的方式。可以解決組合繼承調用兩次構造函數導致子類最終會包含超類對象的全部實例屬性的問題。
(2)寄生式組合繼承,就是通過借用構造函數來繼承屬性,通過原型鏈的混成形式來繼承方法。其思想是:不必為了指定子類型的原型而調用超類型的構造函數,我們所需的無非就是超類型原型的一個副本而已。本質上就是,使用寄生式繼承來繼承超類型的原型,然再將結果指定給子類型的原型。其基本模式如下:
function inheritPrototype(SubType,superType) { var prototype = object(superType.prototype); //創建對象 prototype.constructor = subType; //增強對象 subType.prototype = prototype; //指定對象 }
這個函數接收兩個參數:子類型構造函數和超類型構造函數。
第一步是創建超類型原型的一個副本;
第二步是為創建的副本添加constructor屬性,從而彌補因重寫原型而失去的默認的constructor屬性;
第三步將新創建的對象(即副本)賦值給子類型的原型。
function inheritPrototype(SubType,superType) { var prototype = object(superType.prototype); //創建對象 prototype.constructor = subType; //增強對象 subType.prototype = prototype; //指定對象 } function SuperType(name) { this.name = name; this.color = ["red","blue","green"]; } SuperType.prototype.sayName = function() { alert(this.name); }; function SubType(name ,age) { //繼承屬性 SuperType.call(this.name); this.age = age; } inheritPrototype(SubType, SuperType); SubType.prototype.sayAge = function() { alert(this.age); };
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/105949.html
摘要:探討判斷橫豎屏的最佳實現前端掘金在移動端,判斷橫豎屏的場景并不少見,比如根據橫豎屏以不同的樣式來適配,抑或是提醒用戶切換為豎屏以保持良好的用戶體驗。 探討判斷橫豎屏的最佳實現 - 前端 - 掘金在移動端,判斷橫豎屏的場景并不少見,比如根據橫豎屏以不同的樣式來適配,抑或是提醒用戶切換為豎屏以保持良好的用戶體驗。 判斷橫豎屏的實現方法多種多樣,本文就此來探討下目前有哪些實現方法以及其中的優...
摘要:大多數情況下,可以是同局部變量完成相同的事情而不引入新的作用域。選擇正確的方法避免不必要的屬性查找一旦多次用到屬性對象,應該將其存儲在局部變量中。盡可能多的使用局部變量將屬性查找替換為值查找。 1、可維護性 1.1 可維護代碼特征 1. 可理解性 2. 直觀性 3. 可適應性 4. 可擴展性 5. 可調試性 1.2 代碼約定 1、可讀性(代碼縮進和代碼注釋) 2、變量和函數命名 變量...
摘要:除此之外,在超類型的原型中定義的方法,對子類型而言也是不可兼得,結果所有類型都只能用構造函數模式。創建對象增強對象指定對象繼承屬性這個例子的高效率體現在它只調用了一次構造函數。 1、原型鏈 原型鏈的基本思想是利用原型讓一個引用類型繼承另一個引用類型的屬性和方法。構造函數、原型和實例的關系:每個構造函數都有一個原型對象;原型對象都包含著一個指向構造函數的指針;實例都包含一個指向原型對象的...
摘要:創建構造函數后,其原型對象默認只會取得屬性至于其他的方法都是從繼承來的。上圖展示了構造函數的原型對象和現有的兩個實例之間的關系。所有原生的引用類型都在其構造函數的原型上定義了方法。 第6章我一共寫了3篇總結,下面是相關鏈接:讀《javaScript高級程序設計-第6章》之理解對象讀《javaScript高級程序設計-第6章》之繼承 工廠模式 所謂的工廠模式就是,把創建具體對象的過程抽象...
摘要:從現在開始,養成寫技術博客的習慣,或許可以在你的職業生涯發揮著不可忽略的作用。如果想了解更多優秀的前端資料,建議收藏下前端英文網站匯總這個網站,收錄了國外一些優質的博客及其視頻資料。 前言 寫文章是一個短期收益少,長期收益很大的一件事情,人們總是高估短期收益,低估長期收益。往往是很多人堅持不下來,特別是寫文章的初期,剛寫完文章沒有人閱讀會有一種挫敗感,影響了后期創作。 從某種意義上說,...
閱讀 2860·2019-08-30 15:44
閱讀 1887·2019-08-29 13:59
閱讀 2845·2019-08-29 12:29
閱讀 1090·2019-08-26 13:57
閱讀 3202·2019-08-26 13:45
閱讀 3330·2019-08-26 10:28
閱讀 825·2019-08-26 10:18
閱讀 1695·2019-08-23 16:52