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

資訊專欄INFORMATION COLUMN

js 中的 call / apply 方法詳解和引用類型的繼承

cod7ce / 2084人閱讀

摘要:也就是說當(dāng)使用后,當(dāng)前執(zhí)行上下文中的對象已被替換為,后續(xù)執(zhí)行將以所持有的狀態(tài)屬性繼續(xù)執(zhí)行。借用的方法替換的實例去調(diào)用相應(yīng)的方法。實現(xiàn)引用類型的繼承其實沒有類這一概念,我們平時使用的等嚴(yán)格來說被稱作引用類型。

call 方法:
object.method.call(targetObj[, argv1, argv2, .....])

apply 方法:
object.method.apply(targetObj[, [argv1, argv2 .....]])

call 和 apply 的作用沒有太大區(qū)別,僅是在調(diào)用時傳遞參數(shù)的方式不同,call 是按位置參數(shù)傳遞,apply 是傳遞一個參數(shù)數(shù)組。

call 和 apply 方法的作用如下:

以 targetObject 替換 object 引入當(dāng)前的執(zhí)行上下文中。

也就是說當(dāng)使用 object.call(targetObj) 后,當(dāng)前執(zhí)行上下文中的 object 對象已被替換為 targetObj,后續(xù)執(zhí)行將以 targetObj 所持有的狀態(tài)屬性繼續(xù)執(zhí)行。

借用 object 的方法:
targetObj 替換 object 的實例去調(diào)用相應(yīng)的方法。

// Person 引用類型
function Person(name, age) {
    this.name = name;
    this.age  = age;
    // Person 的對象方法
    this.getName = function () {
        console.log(this.name);
    }
}

// Person 的原型方法
Person.prototype.getInfo = function (joinStr, endLine) {
    joinStr = joinStr || "-";
    endLine = endLine || "!";
    console.log(this.name + joinStr + this.age + endLine);
}

// Boy 引用類型
function Boy(name, age) {
    this.name = name;
    this.age  = age;
}

var lilei  = new Boy("lilei", 18);

// 調(diào)用 Person 的原型方法
// 注:原型方法和對象方法并不對等,雖然二者皆可被對象繼承 但原型鏈上只有原型方法 沒有對象方法
// 所以對象方法還是要以下面實例化一個對象的方式去調(diào)用,不能直接通過原型鏈訪問
Person.prototype.getInfo.call(lilei, "-", "!");
Person.prototype.getInfo.apply(lilei, ["-", "!"]);

// 調(diào)用 Person 的對象方法
var person = new Person("none", 0);
person.getName.call(lilei);
person.getInfo.apply(lilei, ["-", "!"]);

Boy 雖然并沒有定義 getName 對象方法,也沒有 getInfo 原型方法,但我們可以方便的使用 call/apply 將 Person 的方法應(yīng)用到 Boy 的實例上。call/apply 的語意其實是說 Person “喊” Boy 的實例過來使用自己的方法。

實現(xiàn)引用類型的繼承:

Javascript 其實沒有類這一概念,我們平時使用的 Array, Date, Math 等嚴(yán)格來說被稱作 “引用類型”。我們可以方便的使用 call/apply 來實現(xiàn)引用類型的對象方法的繼承,從而讓代碼更加的精簡。

繼承分為 對象繼承 和 原型鏈繼承 兩部分

// Person 引用類型
function Person(name, age) {
    this.name = name;
    this.age  = age;
    // Person 的對象方法
    this.getName = function () {
        console.log(this.name);
    }
}

// Person 的原型方法
Person.prototype.getInfo = function (joinStr, endLine) {
    joinStr = joinStr || "-";
    endLine = endLine || "!";
    console.log(this.name + joinStr + this.age + endLine);
}

// ======================================================
// Boy 引用類型
function Boy(name, age) {
    // 對象冒充繼承
    // 將 Person 的對象成員繼承過來
    Person.call(this, name, age);
}

// 原型鏈繼承
// 將 Person 的原型屬性繼承過來
Boy.prototype = new Person();
// ======================================================

var lilei  = new Boy("lilei", 18);

lilei.getName();
lilei.getInfo();
console.log(Boy.prototype.getInfo);

注意這里 call/apply 只是繼承父原型的對象方法,原型方法還需要多帶帶的繼承一次。

平時開發(fā)中比較經(jīng)典的用例就是:

Array.prototype.slice.call(document.getElementsByTagName("p"));

如上代碼會返回一個DOM元素數(shù)組,document.getElementsByTagName("p") 獲取到的并不是真正意義上的數(shù)組,沒辦法使用 pop 或 push 等方法,Array.prototype.slice 的實現(xiàn)大致如下:

Array.prototype.slice = function (start, end) {
    var temp  = [];
    var start = start || 0;
    var end   = end || this.length - 1;
    
    for (var i = start; i <= end; i ++) {
        temp.push(this[i]);
    }
    
    return temp;
}

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

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

相關(guān)文章

  • JavaScript繼承方式詳解

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

    Yangyang 評論0 收藏0
  • JavaScript 繼承方式詳解

    摘要:原型繼承與類繼承類繼承是在子類型構(gòu)造函數(shù)的內(nèi)部調(diào)用父類型的構(gòu)造函數(shù)原型式繼承是借助已有的對象創(chuàng)建新的對象,將子類的原型指向父類。 JavaScript 繼承方式的概念 js 中實現(xiàn)繼承有兩種常用方式: 原型鏈繼承(對象間的繼承) 類式繼承(構(gòu)造函數(shù)間的繼承) JavaScript不是真正的面向?qū)ο蟮恼Z言,想實現(xiàn)繼承可以用JS的原型prototype機制或者call和apply方法 在面...

    YuboonaZhang 評論0 收藏0
  • js原型繼承

    摘要:舉例說明組合繼承組合繼承利用原型鏈借用構(gòu)造函數(shù)的模式解決了原型鏈繼承和類式繼承的問題。示例組合式繼承是比較常用的一種繼承方法,其背后的思路是使用原型鏈實現(xiàn)對原型屬性和方法的繼承,而通過借用構(gòu)造函數(shù)來實現(xiàn)對實例屬性的繼承。 對js原型和繼承的理解一直處于不懂-懂-不懂-懂-不懂。。。的無限循環(huán)之中,本來打算只是簡單總結(jié)下js繼承方式,可看了些網(wǎng)上的資料后,發(fā)現(xiàn)又不懂繼承了。。。這篇文章只...

    Hujiawei 評論0 收藏0
  • 詳解js繼承(二)

    摘要:寄生組合式繼承終于寫到最后一個繼承了,我們在之前講了種繼承方式,分別是原型鏈,借用構(gòu)造函數(shù)繼承,組合繼承,原型式繼承,寄生式繼承,其中,前三種聯(lián)系比較緊密,后面兩種也比較緊密,而我們要講的最后一種,是和組合繼承還有寄生式繼承有關(guān)系的。 前言 趁周末結(jié)束之前趕緊先把坑填上。上回我們說到了原型鏈,并且留下了幾個思考題,先把答案公布一下。 在最后一個例子里,console.log(b1.c...

    evin2016 評論0 收藏0
  • JavaScript面向?qū)ο蠛诵闹R歸納

    摘要:一面向?qū)ο蟾拍蠲嫦驅(qū)ο缶褪鞘褂脤ο?。因此在?gòu)造函數(shù)中表示剛剛創(chuàng)建出來的對象。在構(gòu)造函數(shù)中利用對象的動態(tài)特性為其對象添加成員。 一、面向?qū)ο?1.1 概念 面向?qū)ο缶褪鞘褂脤ο蟆C嫦驅(qū)ο箝_發(fā)就是使用對象開發(fā)。 面向過程就是用過程的方式進行開發(fā)。面向?qū)ο笫菍γ嫦蜻^程的封裝。 1.2 三大特性 抽象性所謂的抽象性就是:如果需要一個對象描述數(shù)據(jù),需要抽取這個對象的核心數(shù)據(jù) 提出需要的核心...

    TalkingData 評論0 收藏0

發(fā)表評論

0條評論

cod7ce

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<