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

通過手寫instanceof理解原型鏈示例詳解

 更新時間:2023年05月05日 15:37:46   作者:一只小菜go  
這篇文章主要為大家介紹了通過手寫instanceof理解原型鏈示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

Instanceof的作用

Instanceof是判斷一個實例是否是其父類或者祖先類型的實例的方法。原理就是Instanceof會接受兩個參數(shù),在查找的過程中會先遍歷左邊變量的原型鏈,直到找到右邊變量的prototype;如果查找失敗,則會返回false。

手寫Instanceof

let myInstanceof = (target, origin) => {
    while(target){
        if(target._proto_ = origin.prototype){
            return true
        }
        target = target._proto_
    }
    return false
}
let arr = [1, 2, 3];
console.log(myInstanceof(arr, Array)) //true;
console.log(myInstanceof(arr, Object)) //true;

什么是原型

除null以外的所有js對象在創(chuàng)建時,都會關(guān)聯(lián)另一個對象,這個被關(guān)聯(lián)的對象就是我們常說的原型,每一個對象都會從關(guān)聯(lián)的對象中繼承屬性,例如:

//構(gòu)造函數(shù)
function Person(age){
    this.age = age
}
Person.prototype.name = '張三'
var person = new Person()
console.log(person.name)//張三

當通過構(gòu)造函數(shù)創(chuàng)建實例后,如果從實例上尋找某個屬性值,如果屬性值就存在于這個實例上,則會直接輸出,否則就會從他的原型對象中去找。

  • prototype: 每個構(gòu)造函數(shù)都有一個prototype屬性,這個屬性指向函數(shù)的原型對象。
  • __ proto__: 每個對象(除了null)都會有的屬性,這個屬性指向?qū)ο蟮脑汀?/li>
  • constructor: 每個原型都有一個constructor屬性,指向關(guān)聯(lián)的構(gòu)造函數(shù)。

下面我們用一組輸出來驗證這些信息:

console.log(Person===Person.prototype.constructor) // true
console.log(person.__proto__ == Person.prototype) // true
console.log(person.__proto__.constructor == Person) // true
console.log(person.constructor == Person) // true

解釋一下為什么person.constructor == Person,前面我們說過,實例上的屬性如果不存在,則會從他的原型對象上找。person.constructor == Person其實就相當于person.__ proto__.constructor == Person。

原型的應用場景

function Person(name, age) {
    this.name = name
    this.age = age
    this.sayHello = function () {
      console.log("hello," + this.name);
  }
}

當我們每次通過構(gòu)造函數(shù)創(chuàng)建實例時,都會創(chuàng)建新的新的sayHello方法,如果創(chuàng)建的實例過多,就會造成性能浪費。此時如果將sayHello掛載到構(gòu)造函數(shù)的prototype上,此時新創(chuàng)建的實例都可以訪問到這個方法了。

function Person(name, age) {
  this.name = name;
  this.age = age;
}
Person.prototype.sayHello = function () {
  console.log("hello," + this.name);
};
const person = new Person();
person.name = "張三";
person.sayHello()//hello,張三;

什么是原型鏈

要解釋這個問題,我們首先要理解好構(gòu)造函數(shù),原型和實例之間的關(guān)系:每個構(gòu)造函數(shù)都有一個原型對象,原型對象都有一個指向其對應的構(gòu)造函數(shù)的指針,而實例都包含一個指向原型對象的內(nèi)部指針。

接下來,如果我們讓原型對象同時等于一個其他的實例呢?

此時原型對象中包含一個指向其他原型的指針,另一個原型中也包含著一個指向另一個構(gòu)造函數(shù)的指針。假如另一個原型又是另一個類型的實例,那么上述關(guān)系依然成立。如此層層遞進,就構(gòu)成了實例與原型的鏈條。就是我們常說的原型鏈。

簡單來說,就是如果從實例上尋找某個屬性值,如果屬性值就存在于這個實例上,則會直接輸出,否則就會從他的原型對象中去找。而原型對象中也沒有的話,則會向原型對象的原型對象中去找。

以上就是通過手寫instanceof理解原型鏈示例詳解的詳細內(nèi)容,更多關(guān)于instanceof原型鏈理解的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 關(guān)于javascript中的promise的用法和注意事項(推薦)

    關(guān)于javascript中的promise的用法和注意事項(推薦)

    這篇文章主要介紹了關(guān)于javascript中的promise的用法和注意事項,需要的朋友可以參考下
    2021-01-01
  • JavaScript中子對象訪問父對象的方式詳解

    JavaScript中子對象訪問父對象的方式詳解

    js中雖然沒有傳統(tǒng)面向?qū)ο蟮木幊陶Z言里子類訪問父類的特殊語法,但是我們可以根據(jù)需要造一個,接下來本文給大家分享在JavaScript中子對象訪問父對象的方式,需要的朋友可以參考下
    2016-09-09
  • JavaScript中兩個感嘆號的作用說明

    JavaScript中兩個感嘆號的作用說明

    用兩個感嘆號的作用就在于,如果明確設置了o中flag的值(非null/undefined/0""/等值),自然test就會取跟o.flag一樣的值;如果沒有設置,test就會默認為false,而不是null或undefined
    2011-12-12
  • 使用JavaScript判斷圖片是否加載完成的三種實現(xiàn)方式

    使用JavaScript判斷圖片是否加載完成的三種實現(xiàn)方式

    有時需要獲取圖片的尺寸,這需要在圖片加載完成以后才可以,本文有三個不錯的實現(xiàn)方式在此與大家分享下
    2014-05-05
  • FF IE瀏覽器修改標簽透明度的方法

    FF IE瀏覽器修改標簽透明度的方法

    本文為大家介紹下FF IE瀏覽器修改標簽透明度的方法,需要的朋友可以參考下
    2014-01-01
  • 微信小程序搭建自己的Https服務器

    微信小程序搭建自己的Https服務器

    這篇文章主要介紹了微信小程序搭建Https服務器,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • RequireJS入門一之實現(xiàn)第一個例子

    RequireJS入門一之實現(xiàn)第一個例子

    RequireJS由James Burke創(chuàng)建,他也是AMD規(guī)范的創(chuàng)始人。大家知道我們?yōu)槭裁匆獙W習requirejs嗎?帶著這個疑問來學習本篇文章吧,感興趣的朋友一起學習RequireJS入門一之實現(xiàn)第一個例子吧
    2015-09-09
  • 最新評論

    炎陵县| 赞皇县| 响水县| 江达县| 大化| 伊宁县| 中卫市| 汉源县| 江城| 子洲县| 池州市| 宣汉县| 富阳市| 南召县| 库尔勒市| 贞丰县| 银川市| 西华县| 山东省| 抚顺市| 唐山市| 石台县| 安新县| 黎平县| 筠连县| 金溪县| 镇巴县| 怀来县| 平塘县| 襄樊市| 宁海县| 珲春市| 松溪县| 肥乡县| 甘泉县| 惠安县| 满洲里市| 晴隆县| 深州市| 谢通门县| 桓仁|