欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

javascript類(lèi)繼承的實(shí)現(xiàn)方法

 更新時(shí)間:2023年10月23日 14:18:26   作者:Fogwind  
JavaScript是一種面向?qū)ο蟮恼Z(yǔ)言,而繼承是面向?qū)ο缶幊痰囊粋€(gè)重要特性,在JavaScript中,繼承的實(shí)現(xiàn)方式有多種,本文將介紹javascript類(lèi)的繼承的實(shí)現(xiàn),感興趣的朋友一起看看吧

首先需要知道兩個(gè)概念:

  • 構(gòu)造函數(shù)的prototype屬性是實(shí)例的原型,這個(gè)屬性的值是一個(gè)對(duì)象,可以被重新賦值,比如有時(shí)候?yàn)榱撕?jiǎn)便會(huì)把prototype屬性重新賦值為一個(gè)對(duì)象字面量;
  • 每個(gè)對(duì)象都有一個(gè)__proto__內(nèi)部屬性,指向自己的原型,雖然是非標(biāo)準(zhǔn)的,但是各大瀏覽器都實(shí)現(xiàn)了他,在mdn文檔中提到的[[Prototype]]就是__proto__。比如實(shí)例的__proto__屬性就是指向了構(gòu)造函數(shù)的prototype;

下面的代碼來(lái)自@better-scroll/core實(shí)現(xiàn)了類(lèi)的繼承。

// extendStatics函數(shù)的作用是實(shí)現(xiàn)類(lèi)靜態(tài)方法的繼承,構(gòu)造函數(shù)原型繼承,最終結(jié)果是d可以訪問(wèn)b的屬性和方法。
var extendStatics = function (d, b) {
    // Object.setPrototypeOf() 方法設(shè)置一個(gè)指定的對(duì)象的原型(即,內(nèi)部 [[Prototype]] 屬性)到另一個(gè)對(duì)象或 null。是Object.prototype.__proto__ 的替代
    extendStatics = Object.setPrototypeOf ||
        (
            // 這里的邏輯是:如果當(dāng)前環(huán)境支持 __proto__關(guān)鍵字, 就用__proto__修改原型的指向
            {
                __proto__: []
            }
            // instanceof 運(yùn)算符用于檢測(cè)構(gòu)造函數(shù)的 prototype 屬性是否出現(xiàn)在某個(gè)實(shí)例對(duì)象的原型鏈上。
            instanceof Array && function (d, b) {
                d.__proto__ = b; // 把d的原型指向b
            }
        ) ||
        /* 如果以上兩者修改原型指向的方法都不支持那么手動(dòng)將b上的屬性添加到d上 */
        function (d, b) {
            for (var p in b) {
                // 如果p是對(duì)象b自身的屬性,那么將屬性p添加到對(duì)象d上
                if (Object.prototype.hasOwnProperty.call(b, p)) {
                    d[p] = b[p];
                }
            }
        };
    return extendStatics(d, b);
};
function __extends(d, b) {
    extendStatics(d, b);
    // 這里 __ 函數(shù)的作用是: 1. 保證d的構(gòu)造函數(shù)指向正確;2.通過(guò) __ 的實(shí)例實(shí)現(xiàn)繼承;
    function __() {
        this.constructor = d;
    }
    __.prototype = b.prototype;
    //Object.create() 方法創(chuàng)建一個(gè)新對(duì)象,使用現(xiàn)有的對(duì)象來(lái)提供新創(chuàng)建的對(duì)象的 __proto__
    // 如果b不是null, d.prototype = new __(); d.prototype.__proto__ = b.prototype;
    d.prototype = b === null ? Object.create(b) : new __();
}

對(duì)于__extends函數(shù)中的如下代碼:

function __() {
    this.constructor = d;
}
__.prototype = b.prototype;
d.prototype = new __();

其實(shí)這段邏輯用Object.create()也能實(shí)現(xiàn),用Object.create()實(shí)現(xiàn)后的__extends如下:

function __extends(d, b) {
    extendStatics(d, b);
    d.prototype = Object.create(b.prototype);
    d.prototype.constructor = d;
}

到此這篇關(guān)于javascript類(lèi)的繼承的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)js類(lèi)繼承內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論