JavaScript原型鏈(死亡纏繞)

JavaScript的原型鏈一直是個我搞不懂的東西。包括我在寫文章和畫關(guān)系圖的時候。
不知道是什么歷史原因讓js產(chǎn)生了如此復雜的繼承關(guān)系。
記得以前玩游戲,有個技能叫:死亡纏繞。來形容這個很貼切。
直接上圖,有問題歡迎指正!

js原型鏈.png

畫圖是明確問題的很好方式,畫了一遍圖之后,清晰了不少。

總結(jié)點規(guī)律:

  • 所有對象都在原型鏈上
  • 除了null 每個對象都有且唯一的proto原型對象,即僅有一條原型鏈
  • 只能訪問原型鏈上的方法和屬性
  • f 由F new操作而來,看似他們關(guān)系很密切 ,其實f和F的原型鏈半毛錢關(guān)系沒有,即F原型鏈上的方法屬性f均不能訪問。

new操作符到底做了什么?

以如下new操作為例:

function F(name) {
    this.name = name;
}
const f = new F("test")
  • 創(chuàng)建一個新對象
let instance = new Object();
  • 創(chuàng)建instance原型鏈
instance.__proto__ = F.prototype;
  • 在instance中執(zhí)行F函數(shù)體
F.call(instance)
  • 判斷執(zhí)行結(jié)果類型,如果為基礎(chǔ)數(shù)據(jù)類型(undefined, null, number, string, Boolean)則返回instance,反之,則返回該對象

自己手動實現(xiàn)一個 newFunc:

function newFunc(func){
    var instance = new Object();
    if (func.prototype !== null) {
        instance.__proto__ = func.prototype;
    }
    var result = func.apply(instance);
    if ((typeof result === "object" || typeof result === "function") && result !== null)               
    {
        return result;
    }
    return instance;
}
//測試
function F(){
    this.a = "hahah"
}
let f = newFunc(F);//F {a: "hahah"}

關(guān)于最后一條可能不好理解,上幾個例子:

    function Person1(name) {
        this.name = name;
    }
    function Person2(name) {
        this.name = name;
        return this.name;
    }
    function Person3(name) {
        this.name = name;
        return new Array();
    }
    function Person4(name) {
        this.name = name;
        return "hahah";
    }
    function Person5(name) {
        this.name = name;
        return function() {};
    }
    function Person6(name) {
        this.name = name;
        return String(1);
    }
    var person1 = new Person1('person1');  // 函數(shù)無返回,默認返回undefined{name: 'person1'}
    var person2 = new Person2('person2');  // {name: 'person2'}
    var person3 = new Person3('person3');  // []
    var person4 = new Person4('person4');  // 'person4'
    var person5 = new Person5('person5');  // function() {}
    var person6 = new Person6('person6');  // name: "person6"
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 在JavaScript中,原型鏈作為一個基礎(chǔ),老生長談,今天我們就來深入的解讀一下原型鏈。 本章主要講的是下面幾點...
    Devinnn閱讀 1,506評論 1 6
  • JavaScript深入系列的第一篇,從原型與原型鏈開始講起,如果你想知道構(gòu)造函數(shù)的實例的原型,原型的原型,原型的...
    Vicky丶Amor閱讀 1,035評論 0 7
  • 前言 ?JavaScript常被描述為一種「基于原型的語言」——每個對象都擁有一個「原型對象」,對象以其原型為模板...
    前端南玖閱讀 167評論 0 1
  • 轉(zhuǎn)自:https://juejin.im/post/6844903797039300615 原型和原型鏈是 JS ...
    江平路閱讀 237評論 0 1
  • 一切皆對象 面向?qū)ο蟮囊粋€重要觀點是:一切皆對象如何做到這一點呢?如何建立繼承體系呢?各種語言,C++、Java、...
    松哥888閱讀 579評論 0 0

友情鏈接更多精彩內(nèi)容