成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript 繼承方式詳解

YuboonaZhang / 3293人閱讀

摘要:原型繼承與類繼承類繼承是在子類型構(gòu)造函數(shù)的內(nèi)部調(diào)用父類型的構(gòu)造函數(shù)原型式繼承是借助已有的對(duì)象創(chuàng)建新的對(duì)象,將子類的原型指向父類。

JavaScript 繼承方式的概念

js 中實(shí)現(xiàn)繼承有兩種常用方式:

原型鏈繼承(對(duì)象間的繼承)
類式繼承(構(gòu)造函數(shù)間的繼承)

JavaScript不是真正的面向?qū)ο蟮恼Z言,想實(shí)現(xiàn)繼承可以用JS的原型prototype機(jī)制或者callapply方法

在面向?qū)ο蟮恼Z言中,可以使用類來創(chuàng)建一個(gè)自定義對(duì)象,當(dāng)然ES6中也引入了class來創(chuàng)建類。在這之前,我們需要使用js的原型來創(chuàng)建自定義對(duì)象。

原型繼承與類繼承

類繼承是在子類型構(gòu)造函數(shù)的內(nèi)部調(diào)用父類型的構(gòu)造函數(shù)

function Super (){
    this.colors = ["blue","red"];
}

function Sub () {
    Super.call(this);
}

原型式繼承是借助已有的對(duì)象創(chuàng)建新的對(duì)象,將子類的原型指向父類。

function Super (id) {
    this.id = id;
}
Super.prototype.toString = function () {
    return "Super" + this.id;
}

function Sub (id) {
    this.id = id;
}

Sub.prototype = new Super();  // 這句即原型式繼承的核心代碼
原型鏈繼承

為了讓子類繼承父類的屬性和方法,首先需要定義一個(gè)構(gòu)造函數(shù),然后將父類的實(shí)例賦值給構(gòu)造函數(shù)的原型。

function Parent () {
    this.name = "Parent";
}

function Child () {
    this.age = 10;
}
Chid.prototype = new Parent();  // Chid繼承Parent,形成原型鏈

var test = new Child();
console.log(test.name) // Parent
console.log(test.age)  // 10    得到被繼承的屬性

// 繼續(xù)原型鏈繼承
function Brother () {
    this.weight = 60;
}
Brother.prototype = new Child();
var peter = new Brother();
console.log(peter.name)  //繼承了Child和Parent,輸出Parent
console.log(peter.age)  // 輸出10

所有的構(gòu)造函數(shù)都繼承自Object,它是自動(dòng)完成繼承的并不需要我們手動(dòng)繼承,那么接著看它們的從屬關(guān)系

確定原型和實(shí)例的關(guān)系

可以通過兩種方式確定原型和實(shí)例的關(guān)系,通過操作符instanceofisPrototypeof()方法

console.log(peter instanceof Object); //true
console.log(test instanceof Brother)  //false,test是brother的父類
console.log(peter instanceof Child) //true
console.log(peter instanceof Parent)  //true

只要是原型鏈中出現(xiàn)過的原型,都可以說是改原型鏈派生的實(shí)例的原型。因此,isProtptypeof()方法也會(huì)返回true

在JS中,被繼承的函數(shù)成為父類(或者 基類、超類),繼承的函數(shù)成為子類(派生類)。使用原型繼承主要有兩個(gè)問題,一是字面量重寫原型會(huì)中斷關(guān)系,使用引用類型的原型,并且子類型無法給父類型傳遞參數(shù)。

偽類解決引用共享和超類型無法傳參的問題,我們可以采用"類式繼承"的方式

類式繼承(借用構(gòu)造函數(shù))
function Parent (age) {
    this.colors = ["blue","red","green"];
    this.age = age;
}

function Child (age) {
    Parent.call(this,age);
}

var peter = new Child(20);
console.log(peter.age) //20
console.log(peter.colors) //blue,red,green

peter.colors.push("white");
console.log(peter.colors) //blue,red,green,white

借用構(gòu)造函數(shù)雖然解決了上面兩張問題,但沒有原型,所以我們需要原型鏈+借用構(gòu)造函數(shù)的模式,這種模式成為組合繼承

組合繼承
function Parent (age) {
    this.colors = ["blue","red","green"];
    this.age = age;
}

Parent.prototype.run = function () {
    return this.colors + " is " +this.age;
}
function Child (age) {
    Parent.call(this,age);  //對(duì)象冒充,給父類型傳參
}
Child.prototype = new Parent();  //原型鏈繼承

var peter = new Child(20);
console.log(peter.run()); //blue,red,green is 20

組合繼承是一種比較常用的方法,思路是使用原型鏈實(shí)現(xiàn)對(duì)原型屬性和方法的繼承,借用構(gòu)造函數(shù)來實(shí)現(xiàn)對(duì)實(shí)例屬性的繼承。這樣,既實(shí)現(xiàn)了原型上定義方法的函數(shù)復(fù)用,又保證每個(gè)實(shí)例都有自己的屬性。

call()與apply()的用法:調(diào)用一個(gè)對(duì)象的一個(gè)方法,用另一個(gè)對(duì)象替換當(dāng)前對(duì)象。

call(thisObj,Object);  // call接收一個(gè)對(duì)象
apply(thisObj,[argArray])  //apply接收一個(gè)數(shù)組
原型式繼承

這種繼承借助原型并基于已有的對(duì)象創(chuàng)建新的對(duì)象,同時(shí)還不用創(chuàng)建自定義類型的方式成為原型式繼承

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

var box = {
        name : "peter",
        arr : ["blue","red","green"]
    };

var b1 = obj(box);
console.log(b1.name) // peter

b1.name = "jack";
console.log(b1.name) //jack

console.log(b1.arr) //blue,red,green
b1.arr.push("white") //blue,red,green,white

var b2 = obj(box);
console.log(b2.name) // peter
console.log(b1.arr) //blue,red,green

原型式繼承首先在obj()函數(shù)內(nèi)部創(chuàng)建一個(gè)臨時(shí)性的構(gòu)造函數(shù),然后將傳入的對(duì)象作為這個(gè)構(gòu)造函數(shù)的原型,最后返回這個(gè)臨時(shí)類型的新實(shí)例。

寄生式繼承

這種繼承方式是把原型式+工廠模式結(jié)合起來,目的是為了封裝創(chuàng)建的過程。

function create(o){
        var f = obj(o);
        f.run = function () {
            return this.arr;//同樣,會(huì)共享引用
        };
        return f;
    }
組合式繼承的問題

組合式繼承是JS最常用的繼承模式,但組合繼承的父類型會(huì)在使用過程中被調(diào)用兩次,一次是創(chuàng)建子類型的時(shí)候,另一次是在子類型構(gòu)造函數(shù)的內(nèi)部

function Parent(name){
        this.name = name;
        this.arr = ["哥哥","妹妹","父母"];
    }

    Parent.prototype.run = function () {
        return this.name;
    };

    function Child(name,age){
        Parent.call(this,age);//第二次調(diào)用
        this.age = age;
    }

    Child.prototype = new Parent();//第一次調(diào)用

以上代碼是組合繼承,那么寄生組合繼承解決了兩次調(diào)用的問題

寄生組合繼承
function obj() {
    function F() {}
    F.prototype = o;
    return new F();
}
function create(parent,test) {
    var f = obj(parent.prototype); //創(chuàng)建對(duì)象
    f.constructor = test; //增強(qiáng)對(duì)象
}
function Parent(name){
        this.name = name;
        this.arr = ["brother","sister","parents"];
    }

Parent.prototype.run = function () {
        return this.name;
    };

function Child(name,age){
        Parent.call(this,name);
        this.age =age;
    }
inheritPrototype(Parent,Child);  //通過這里實(shí)現(xiàn)繼承

var test = new Child("peter",20);
test.arr.push("new");
console.log(test.arr);  //brother,sister,parents,new
console.log(test.run());  //只共享了方法

var test2 = new Child("jack",22);
console.log(test2.arr);  //引用問題解決
call和apply

call和apply可以用來改變函數(shù)中this的指向:

// 定義一個(gè)全局函數(shù)
function f () {
    console.log(this.name);
}
// 定義一個(gè)全局變量
var name = "peter";
var obj = {
    name: "jack";
};

f.apply(window); //apple, 此時(shí)this 等于window  相當(dāng)于window.f()
f.apply(obj);  //jack, 此時(shí)this === obj 相當(dāng)于obj.f()

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/79043.html

相關(guān)文章

  • JavaScript繼承方式詳解

    摘要:可以通過構(gòu)造函數(shù)和原型的方式模擬實(shí)現(xiàn)類的功能。原型式繼承與類式繼承類式繼承是在子類型構(gòu)造函數(shù)的內(nèi)部調(diào)用超類型的構(gòu)造函數(shù)。寄生式繼承這種繼承方式是把原型式工廠模式結(jié)合起來,目的是為了封裝創(chuàng)建的過程。 js繼承的概念 js里常用的如下兩種繼承方式: 原型鏈繼承(對(duì)象間的繼承) 類式繼承(構(gòu)造函數(shù)間的繼承) 由于js不像java那樣是真正面向?qū)ο蟮恼Z言,js是基于對(duì)象的,它沒有類的概念。...

    Yangyang 評(píng)論0 收藏0
  • JavaScript深入淺出

    摘要:理解的函數(shù)基礎(chǔ)要搞好深入淺出原型使用原型模型,雖然這經(jīng)常被當(dāng)作缺點(diǎn)提及,但是只要善于運(yùn)用,其實(shí)基于原型的繼承模型比傳統(tǒng)的類繼承還要強(qiáng)大。中文指南基本操作指南二繼續(xù)熟悉的幾對(duì)方法,包括,,。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。 怎樣使用 this 因?yàn)楸救藢儆趥吻岸?,因此文中只看懂?8 成左右,希望能夠給大家?guī)韼椭?...(據(jù)說是阿里的前端妹子寫的) this 的值到底...

    blair 評(píng)論0 收藏0
  • javaScript原型及原型鏈詳解(二)

    摘要:當(dāng)然這還沒完,因?yàn)槲覀冞€有重要的一步?jīng)]完成,沒錯(cuò)就是上面的第行代碼,如果沒有這行代碼實(shí)例中的指針是指向構(gòu)造函數(shù)的,這樣顯然是不對(duì)的,因?yàn)檎G闆r下應(yīng)該指向它的構(gòu)造函數(shù),因此我們需要手動(dòng)更改使重新指向?qū)ο蟆? 第一節(jié)內(nèi)容:javaScript原型及原型鏈詳解(二) 第一節(jié)中我們介紹了javascript中的原型和原型鏈,這一節(jié)我們來講利用原型和原型鏈我們可以做些什么。 普通對(duì)象的繼承 ...

    widuu 評(píng)論0 收藏0
  • javascript對(duì)象詳解:__proto__和prototype的區(qū)別和聯(lián)系

    摘要:當(dāng)這步完成,這個(gè)對(duì)象就與構(gòu)造函數(shù)再無聯(lián)系,這個(gè)時(shí)候即使構(gòu)造函數(shù)再加任何成員,都不再影響已經(jīng)實(shí)例化的對(duì)象了。此時(shí),對(duì)象具有了和屬性,同時(shí)具有了構(gòu)造函數(shù)的原型對(duì)象的所有成員,當(dāng)然,此時(shí)該原型對(duì)象是沒有成員的。 前言 本篇文章用來記錄下最近研究對(duì)象的一些心得,做一個(gè)記錄與總結(jié),以加深自己的印象,同時(shí),希望也能給正在學(xué)習(xí)中的你一點(diǎn)啟發(fā)。本文適合有一定JavaScript基礎(chǔ)的童鞋閱讀。原文戳這...

    chavesgu 評(píng)論0 收藏0
  • 前端文檔收集

    摘要:系列種優(yōu)化頁面加載速度的方法隨筆分類中個(gè)最重要的技術(shù)點(diǎn)常用整理網(wǎng)頁性能管理詳解離線緩存簡(jiǎn)介系列編寫高性能有趣的原生數(shù)組函數(shù)數(shù)據(jù)訪問性能優(yōu)化方案實(shí)現(xiàn)的大排序算法一怪對(duì)象常用方法函數(shù)收集數(shù)組的操作面向?qū)ο蠛驮屠^承中關(guān)鍵詞的優(yōu)雅解釋淺談系列 H5系列 10種優(yōu)化頁面加載速度的方法 隨筆分類 - HTML5 HTML5中40個(gè)最重要的技術(shù)點(diǎn) 常用meta整理 網(wǎng)頁性能管理詳解 HTML5 ...

    jsbintask 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<