最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript類繼承的實現(xiàn)方法

 更新時間:2023年10月23日 14:18:26   作者:Fogwind  
JavaScript是一種面向對象的語言,而繼承是面向對象編程的一個重要特性,在JavaScript中,繼承的實現(xiàn)方式有多種,本文將介紹javascript類的繼承的實現(xiàn),感興趣的朋友一起看看吧

首先需要知道兩個概念:

  • 構造函數的prototype屬性是實例的原型,這個屬性的值是一個對象,可以被重新賦值,比如有時候為了簡便會把prototype屬性重新賦值為一個對象字面量;
  • 每個對象都有一個__proto__內部屬性,指向自己的原型,雖然是非標準的,但是各大瀏覽器都實現(xiàn)了他,在mdn文檔中提到的[[Prototype]]就是__proto__。比如實例的__proto__屬性就是指向了構造函數的prototype;

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

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

對于__extends函數中的如下代碼:

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

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

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

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

相關文章

最新評論

濮阳县| 同德县| 中宁县| 交口县| 石门县| 宁海县| 瑞安市| 丰宁| 拉萨市| 蒙山县| 灌云县| 遵化市| 江津市| 荣昌县| 霍城县| 铜鼓县| 普定县| 仙桃市| 普陀区| 搜索| 吐鲁番市| 贵德县| 元江| 专栏| 泰来县| 滨海县| 新丰县| 陕西省| 天津市| 鄂伦春自治旗| 柳州市| 龙陵县| 伊春市| 固安县| 治多县| 中牟县| 康平县| 安岳县| 福安市| 望都县| 德保县|