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

通過(guò)手寫(xiě)instanceof理解原型鏈?zhǔn)纠斀?/h1>
 更新時(shí)間:2023年05月05日 15:37:46   作者:一只小菜go  
這篇文章主要為大家介紹了通過(guò)手寫(xiě)instanceof理解原型鏈?zhǔn)纠斀?,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

Instanceof的作用

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

手寫(xiě)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對(duì)象在創(chuàng)建時(shí),都會(huì)關(guān)聯(lián)另一個(gè)對(duì)象,這個(gè)被關(guān)聯(lián)的對(duì)象就是我們常說(shuō)的原型,每一個(gè)對(duì)象都會(huì)從關(guān)聯(lián)的對(duì)象中繼承屬性,例如:

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

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

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

下面我們用一組輸出來(lái)驗(yàn)證這些信息:

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,前面我們說(shuō)過(guò),實(shí)例上的屬性如果不存在,則會(huì)從他的原型對(duì)象上找。person.constructor == Person其實(shí)就相當(dāng)于person.__ proto__.constructor == Person。

原型的應(yīng)用場(chǎng)景

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

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

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è)問(wèn)題,我們首先要理解好構(gòu)造函數(shù),原型和實(shí)例之間的關(guān)系:每個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象,原型對(duì)象都有一個(gè)指向其對(duì)應(yīng)的構(gòu)造函數(shù)的指針,而實(shí)例都包含一個(gè)指向原型對(duì)象的內(nèi)部指針。

接下來(lái),如果我們讓原型對(duì)象同時(shí)等于一個(gè)其他的實(shí)例呢?

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

簡(jiǎn)單來(lái)說(shuō),就是如果從實(shí)例上尋找某個(gè)屬性值,如果屬性值就存在于這個(gè)實(shí)例上,則會(huì)直接輸出,否則就會(huì)從他的原型對(duì)象中去找。而原型對(duì)象中也沒(méi)有的話,則會(huì)向原型對(duì)象的原型對(duì)象中去找。

以上就是通過(guò)手寫(xiě)instanceof理解原型鏈?zhǔn)纠斀獾脑敿?xì)內(nèi)容,更多關(guān)于instanceof原型鏈理解的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • jQuery ajax(復(fù)習(xí))—Baidu ajax request分離版

    jQuery ajax(復(fù)習(xí))—Baidu ajax request分離版

    你沒(méi)有看錯(cuò)標(biāo)題,本文的確是在講Baidu ajax,不過(guò)是很久很久以前的版本了,我們先分析一段簡(jiǎn)單的ajax代碼,來(lái)自早期的百度七巧板項(xiàng)目通過(guò)這個(gè)來(lái)先復(fù)習(xí)一遍ajax的知識(shí)
    2013-01-01
  • js和jquery中循環(huán)的退出和繼續(xù)下一個(gè)循環(huán)

    js和jquery中循環(huán)的退出和繼續(xù)下一個(gè)循環(huán)

    退出循環(huán),使用break;退出當(dāng)前循環(huán)繼續(xù)下一個(gè)循環(huán),使用continue,jquery中使用return false;continue,使用return true
    2014-09-09
  • javascript多行字符串的簡(jiǎn)單實(shí)現(xiàn)方式

    javascript多行字符串的簡(jiǎn)單實(shí)現(xiàn)方式

    之前我們給大家講訴過(guò)javascript多行字符串的7種解決辦法,今天來(lái)給大家分享一個(gè)更簡(jiǎn)單的方法,非常的實(shí)用,大家一定要仔細(xì)看看哦。
    2015-05-05
  • 工作需要寫(xiě)的一個(gè)js拖拽組件

    工作需要寫(xiě)的一個(gè)js拖拽組件

    工作需要寫(xiě)的一個(gè)js拖拽組件,需要的朋友可以參考下代碼。
    2011-07-07
  • js實(shí)現(xiàn)iframe跨頁(yè)面調(diào)用函數(shù)的方法

    js實(shí)現(xiàn)iframe跨頁(yè)面調(diào)用函數(shù)的方法

    這篇文章主要介紹了js實(shí)現(xiàn)iframe跨頁(yè)面調(diào)用函數(shù)的方法,實(shí)例展示了iframe中父頁(yè)面調(diào)用子頁(yè)面和子頁(yè)面調(diào)用父頁(yè)面的實(shí)現(xiàn)技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-12-12
  • ES6新特性六:promise對(duì)象實(shí)例詳解

    ES6新特性六:promise對(duì)象實(shí)例詳解

    這篇文章主要介紹了ES6新特性之promise對(duì)象,結(jié)合實(shí)例形式詳細(xì)分析了promise對(duì)象的功能、狀態(tài)、使用方法與相關(guān)操作技巧,需要的朋友可以參考下
    2017-04-04
  • postMessage及webSocket跨域方案詳解

    postMessage及webSocket跨域方案詳解

    這篇文章主要為大家介紹了postMessage及webSocket跨域方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 如何阻止小程序遮罩層下方圖層滾動(dòng)

    如何阻止小程序遮罩層下方圖層滾動(dòng)

    這篇文章主要介紹了如何阻止小程序遮罩層下方圖層滾動(dòng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • js中的閉包學(xué)習(xí)心得

    js中的閉包學(xué)習(xí)心得

    這篇文章主要介紹了js中的閉包學(xué)習(xí)心得以及重要點(diǎn)的代碼寫(xiě)法,對(duì)此有興趣的朋友跟著小編一起學(xué)習(xí)下吧。
    2018-02-02
  • 分享js粘帖屏幕截圖到web頁(yè)面插件screenshot-paste

    分享js粘帖屏幕截圖到web頁(yè)面插件screenshot-paste

    這篇文章主要為大家分享了js粘帖屏幕截圖到web頁(yè)面插件screenshot-paste的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-03-03

最新評(píng)論