国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

第4集丨JavaScript 使用原型(prototype)實現(xiàn)繼承——最佳實戰(zhàn)2

這篇具有很好參考價值的文章主要介紹了第4集丨JavaScript 使用原型(prototype)實現(xiàn)繼承——最佳實戰(zhàn)2。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

書接上集,在上集中我們給出了一個需求說明,要求利用現(xiàn)學(xué)的知識實現(xiàn)原型(prototype)繼承,并且我們給出了三種實現(xiàn)方式。但是這三種方式各自有優(yōu)缺點,都不能很好的滿足要求,那是否還有其他更好的實現(xiàn)方式呢?

在看本文之前,諸位可以自己思考下?帶著問題去學(xué)習(xí)總是能夠?qū)W到更多內(nèi)容。在以后的歲月中,會找一些有意義的句子,與諸君共勉。

在時間的稿紙上,每個人都在寫著自己的歷史。當(dāng)你抓著今天時,你就會前進(jìn)一步,當(dāng)你丟棄今天時,你就會停滯不動。

一、臨時構(gòu)造器方式

上集中,我們利用prototype方式實現(xiàn)繼承,會帶來一個問題:所有的屬性都指向了一個相同的對象,父對象就會受到子對象屬性的影響。

如何解決這個問題?

這時就必須利用某種中介來打破這種連鎖關(guān)系。我們可以用一個臨時的構(gòu)造器函數(shù)來充當(dāng)中介。即:我們創(chuàng)建一個空函數(shù)f(),并將其原型設(shè)置為父級構(gòu)造器,然后我們既可以用new F()來創(chuàng)建一些不包含父對象屬性的對象,同時又可以從父對象prototype中繼承一切了。

1.1 代碼實現(xiàn)

function Shape(){}
Shape.prototype.name = "Shape";
Shape.prototype.toString = function () {
    return this.name;
}
function TwoDShape(){}
var F = function(){};
F.prototype = Shape.prototype;
TwoDShape.prototype = new F();
TwoDShape.prototype.constructor = TwoDShape;
TwoDShape.prototype.name = "2D Shape";
function Triangle(side, height){
    this.side = side;
    this.height = height;
}
var F = function(){};
F.prototype = TwoDShape.prototype;
Triangle.prototype = new F();
Triangle.prototype.constructor = Triangle;
Triangle.prototype.name = "Triangle";
Triangle.prototype.getArea = function () {
    return this.side * this.height / 2;
}
var my = new Triangle(5, 10);
console.log(my.getArea());  //25
console.log(my.name);   //Triangle
console.log(my.toString()); //Triangle
var supers = new Shape();
console.log(supers.name);   //Shape 注意

1.2 代碼分析

從下圖中我們可以看出my 對象的結(jié)構(gòu)

第4集丨JavaScript 使用原型(prototype)實現(xiàn)繼承——最佳實戰(zhàn)2,JavaScript,原型模式,javascript,開發(fā)語言,前端
那么這個時候toString() 方法查找分幾步呢?

  • 在本類中查找
  • my對象的my.[[Prototype]] 中找,此時該[[Prototype]] 對象為TwoDShape的實例,里面只有一個name = "Triangele"屬性。
  • my對象的my.[[Prototype]].[[Prototype]] 中找,為Shape的實例,同樣里面也只有一個name="2D Shape" 屬性
  • my.[[Prototype]].[[Prototype]].[[Prototype]] 中找,為Object實例,此時,就已經(jīng)找到了 toString() 方法。

二. 增加uber屬性,用于子對象訪問父對象

2.1 實現(xiàn)分析

uber 屬性的名字原本應(yīng)該是“superclass”,但是這樣一來顯得JavaScript中有了類的概念(在ES6中引入了class),或許該叫super,但是superJavaScript的保留字,因為改成uber。

  • 我們給構(gòu)造函數(shù)增加一個uber屬性,使其值為父類的原型Triangle.uber = TwoDShape.prototype;
  • 如下圖所示,此時構(gòu)造函數(shù)Triangle() 中,包含了uber屬性
    第4集丨JavaScript 使用原型(prototype)實現(xiàn)繼承——最佳實戰(zhàn)2,JavaScript,原型模式,javascript,開發(fā)語言,前端

2.2 代碼實現(xiàn)

function Shape(){}
Shape.prototype.name = "Shape";
Shape.prototype.toString = function () {
    var result = [];
    if(this.constructor.uber){
        result[result.length] = this.constructor.uber.toString();
    }
    result[result.length] = this.name;
    return result.join(', ');
}
function TwoDShape(){}
var F = function(){};
F.prototype = Shape.prototype;
TwoDShape.prototype = new F();
TwoDShape.prototype.constructor = TwoDShape;
TwoDShape.uber = Shape.prototype;   //增加uber屬性,指向父類的原型
TwoDShape.prototype.name = "2D Shape";
function Triangle(side, height){
    this.side = side;
    this.height = height;
}
var F = function(){};
F.prototype = TwoDShape.prototype;
Triangle.prototype = new F();
Triangle.prototype.constructor = Triangle;
Triangle.uber = TwoDShape.prototype;
Triangle.prototype.name = "Triangle";
Triangle.prototype.getArea = function () {
    return this.side * this.height / 2;
}
var my = new Triangle(5, 10);
console.log(my.getArea());  //25
console.log(my.name);   //Triangle
console.log(my.toString()); //Shape, 2D Shape, Triangle
var supers = new Shape();
console.log(supers.name);   //Shape

三. 將繼承封裝成extend()函數(shù)

  • 為了代碼的封裝和重用,我們可以將實現(xiàn)繼承的部分抽取出來,定義一個extend()函數(shù)。

3.1 代碼實現(xiàn)

extend()相比,extend2() 顯得略遜一籌。因為這里執(zhí)行的是子對象原型的逐一拷貝,而非簡單的原型鏈查詢。所以我們必須要記住,這種方式僅適用于只包含基本數(shù)據(jù)類型的對象,所有的對象類型(包括函數(shù)和數(shù)組)都是不可復(fù)制的,因為他們只支持引用傳遞。

這里toString()方法實際上是同一個函數(shù)對象。這里只是一個函數(shù)引用,函數(shù)本身并沒有再次被創(chuàng)建。

優(yōu)缺點

  • extend2()方法的效率要低于extend()方法,主要是前者對部分原型屬性進(jìn)行了重建。
  • 當(dāng)然了,這對于只包含基本數(shù)據(jù)類型的對象來說,是有好處的。因為這樣做能使屬性查找操作更多的停留在對象本身,從而減少了原型鏈上的查找。

3.1.1 臨時構(gòu)造器實現(xiàn)extend()

//定義extend函數(shù)
function extend(Child, Parent){
    var F = function () {};
    F.prototype = Parent.prototype;
    Child.prototype = new F();
    Child.prototype.constructor = Child;
    Child.uber = Parent.prototype;

}

3.1.2 原型復(fù)制實現(xiàn)extend2()

function extend2(Child, Parent){
    var p = Parent.prototype;
    var c = Child.prototype;
    for (var i in p){
        c[i] = p[i];
    }
    c.uber = p; //擴(kuò)展子類原型,增加一個uber屬性
}

3.2 代碼測試

3.2.1 測試extend()函數(shù)

  • 利用上述extend() 函數(shù)實現(xiàn)繼承。

//定義Shape類
function Shape(){}
Shape.prototype.name = "Shape";
Shape.prototype.toString = function () {
    return this.name;
}

//定義TwoDShape類
function TwoDShape(){}
extend(TwoDShape, Shape);
TwoDShape.prototype.name = "2D Shape";

//定義Triangle類
function Triangle(side, height){
    this.side = side;
    this.height = height;
}
extend(Triangle, TwoDShape);
Triangle.prototype.name = "Triangle";
Triangle.prototype.getArea = function () {
    return this.side * this.height / 2;
}

//測試
var my = new Triangle(5, 10);
console.log(my.getArea());  //25
console.log(my.name);   //Triangle
console.log(my.toString()); // Triangle
var supers = new Shape();
console.log(supers.name);   //Shape

3.2.1 測試extend2() 函數(shù)

//定義Shape類
function Shape(){}
Shape.prototype.name = "Shape";
Shape.prototype.toString = function () {
    return this.name;
}

//定義TwoDShape類
function TwoDShape(){}
extend(TwoDShape, Shape);

//extend測試結(jié)果
var td = new TwoDShape();
 console.log(td.name);   //Shape
 console.log(TwoDShape.prototype.name); //Shape
 console.log(td.__proto__.name); //Shape
 console.log(td.hasOwnProperty("name")); //false
 console.log(td.__proto__.hasOwnProperty("name"));   //false

//extend2測試結(jié)果
var td = new TwoDShape();
console.log(td.__proto__.hasOwnProperty("name"));   //true
console.log(td.__proto__.hasOwnProperty("toString"));   //true
console.log(td.__proto__.toString == Shape.prototype.toString); //true

四、實例對象原型繼承:以實例對象為原型創(chuàng)建新對象

4.1 功能分析

基于這種在對象之間直接構(gòu)建繼承關(guān)系的理念,我們可以創(chuàng)建一個object()函數(shù),接受父對象,并返回一個以該對象為原型的新對象。這和Object.create() 類似。如下代碼所示:

function object(o){
    var F = function(){};
    F.prototype = o;
    return new F();
}

如果需要訪問父類,則可加添加uber屬性。文章來源地址http://www.zghlxwxcb.cn/news/detail-532800.html

function object(o){
    var n;
    var F = function(){};
    F.prototype = o;
    n = new F();
    n.uber = o;
    return n;
}

4.2 功能測試

//定義Shape類
 function Shape(){}
 Shape.prototype.name = "Shape";
 Shape.prototype.toString2 = function () {
     return this.name;
 }
 
 var shapeObj = new Shape();
 var twoDShape = object(shapeObj);
 twoDShape.name = "HHH"
 console.log(twoDShape.toString2()); //HHH
  • twoDShape 對象的結(jié)構(gòu)如下所示
    第4集丨JavaScript 使用原型(prototype)實現(xiàn)繼承——最佳實戰(zhàn)2,JavaScript,原型模式,javascript,開發(fā)語言,前端

到了這里,關(guān)于第4集丨JavaScript 使用原型(prototype)實現(xiàn)繼承——最佳實戰(zhàn)2的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • javascript中的prototype;javascript中的原型鏈

    在JavaScript中,每個對象都有一個原型(prototype),并且原型可以有自己的原型,形成了一個鏈?zhǔn)浇Y(jié)構(gòu),被稱為原型鏈。這個機制是JavaScript中實現(xiàn)繼承和對象屬性查找的基礎(chǔ)。 原型鏈?zhǔn)怯蓪ο笾g的連接構(gòu)成的。每個對象都有一個指向它原型的鏈接,這個鏈接可以追溯到頂層

    2024年02月20日
    瀏覽(19)
  • 什么是原型鏈(Prototype Chain)?它在JavaScript中有什么作用?請解釋一下JavaScript中的“this”關(guān)鍵字的含義和用法。

    原型鏈(Prototype Chain)是一種在JavaScript中創(chuàng)建對象的方式,它允許我們通過繼承來擴(kuò)展對象的屬性和方法。 在原型鏈中,每個對象都有一個原型對象(也稱為“原型”或“ proto ”),該對象繼承了其父對象的屬性和方法。當(dāng)我們在一個對象上定義一個屬性或方法時,如果該

    2024年02月11日
    瀏覽(25)
  • 什么是JavaScript中的類(Class)和繼承(Inheritance)?它們與原型鏈繼承相比有哪些優(yōu)缺點?

    JavaScript中的類(Class)和繼承(Inheritance)是面向?qū)ο缶幊痰闹匾拍睢n愂且环N抽象的概念,它定義了一組屬性和方法,并且這些屬性和方法可以在同一組對象中重復(fù)使用。繼承是類之間的層次關(guān)系,其中一個類繼承了另一個類的屬性和方法,從而能夠共享其代碼和行為。 在Ja

    2024年02月12日
    瀏覽(35)
  • 設(shè)計模式之原型模式Prototype的C++實現(xiàn)

    設(shè)計模式之原型模式Prototype的C++實現(xiàn)

    1、原型模式提出 在軟件功能設(shè)計中,經(jīng)常面臨著“某些結(jié)構(gòu)復(fù)雜的對象”的創(chuàng)建工作,且創(chuàng)建的對象想擁有其他對象在某一刻的狀態(tài),則可以使用原型模型。原型模型是通過拷貝構(gòu)造函數(shù)來創(chuàng)建對象,并且該對象擁有其他對象在某一刻的狀態(tài)。 2、需求描述 設(shè)計產(chǎn)品A,B,這

    2024年02月12日
    瀏覽(21)
  • SAP Fiori開發(fā)中的JavaScript基礎(chǔ)知識15 - 原型,object,constructor,class,繼承

    SAP Fiori開發(fā)中的JavaScript基礎(chǔ)知識15 - 原型,object,constructor,class,繼承

    本文將介紹JavaScript中的核心概念 - 原型,并會介紹基于原型的應(yīng)用場景object,constructor,class,繼承。 本文會將這幾個核心概念匯總在一篇博客中,因為這些概念是觸類旁通的,希望對你有幫助。 在JavaScript中,幾乎所有的東西都是對象,每個對象都有一個 特殊的內(nèi)部屬性

    2024年04月23日
    瀏覽(43)
  • 【設(shè)計模式——學(xué)習(xí)筆記】23種設(shè)計模式——原型模式Prototype(原理講解+應(yīng)用場景介紹+案例介紹+Java代碼實現(xiàn))

    【設(shè)計模式——學(xué)習(xí)筆記】23種設(shè)計模式——原型模式Prototype(原理講解+應(yīng)用場景介紹+案例介紹+Java代碼實現(xiàn))

    原型模式指用通過拷貝原型實例創(chuàng)建新的實例,新實例和原型實例的屬性完全一致 原型模式是一種創(chuàng)建型設(shè)計模式 工作原理是通過調(diào)用原型實例的 clone() 方法來完成克隆,原型實例需要實現(xiàn)Cloneable接口,并重寫 clone() 方法 需要為每個類開發(fā)一個克隆方法,這對全新的類來說

    2024年02月16日
    瀏覽(57)
  • JavaScript中手動實現(xiàn)Array.prototype.map方法

    JavaScript中手動實現(xiàn)Array.prototype.map方法

    在前端開發(fā)中,我們經(jīng)常需要對數(shù)組進(jìn)行操作和處理。在JavaScript中,數(shù)組是常用的數(shù)據(jù)類型之一。而數(shù)組的map方法可以將一個數(shù)組中的每個元素都進(jìn)行某種操作,并返回一個新的數(shù)組。今天,我們就來手動實現(xiàn)JavaScript中數(shù)組原型的map方法。 首先,讓我們回顧一下map方法的基

    2024年02月21日
    瀏覽(22)
  • 原型模式(Prototype Pattern)

    原型模式(Prototype Pattern)

    原型模式(Prototype Pattern)結(jié)構(gòu)較為簡單,它是一種特殊的創(chuàng)建型模式, 當(dāng)需要創(chuàng)建大量相同或者相似對象時 ,可以 通過對一個已有對象的復(fù)制獲取更多對象 。Java語言提供了較為簡單的原型模式解決方案,只需要創(chuàng)建一個原型對象,然后通過在類中定義的克隆方法復(fù)制自己

    2024年02月03日
    瀏覽(22)
  • 原型模式(Prototype Pattern)

    原型模式(Prototype Pattern)是一種創(chuàng)建型設(shè)計模式,它用于通過復(fù)制現(xiàn)有對象來創(chuàng)建新對象,而無需依賴顯式的構(gòu)造函數(shù)。 在原型模式中,我們創(chuàng)建一個原型對象,并通過復(fù)制該原型對象來創(chuàng)建新的對象。這樣做的好處是,我們可以避免創(chuàng)建對象時的復(fù)雜實例化過程,而是通

    2024年02月15日
    瀏覽(27)
  • 5 原型模式 Prototype

    5 原型模式 Prototype

    指原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象 當(dāng)代碼不應(yīng)該依賴于需要復(fù)制的對象的具體類時,請使用Prototype模式。 Spring源碼中的應(yīng)用 ? 1.可以不耦合具體類的情況下克隆對象 2.避免重復(fù)的初始化代碼 3.更方便的構(gòu)建復(fù)雜對象

    2024年02月22日
    瀏覽(14)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包