通过手写instanceof理解原型链示例详解

 更新时间:2023年05月05日 15:37:46   作者:一只小菜go  
这篇文章主要为大家介绍了通过手写instanceof理解原型链示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

Instanceof的作用

Instanceof是判断一个实例是否是其父类或者祖先类型的实例的方法。原理就是Instanceof会接受两个参数,在查找的过程中会先遍历左边变量的原型链,直到找到右边变量的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对象在创建时,都会关联另一个对象,这个被关联的对象就是我们常说的原型,每一个对象都会从关联的对象中继承属性,例如:

//构造函数
function Person(age){
    this.age = age
}
Person.prototype.name = '张三'
var person = new Person()
console.log(person.name)//张三

当通过构造函数创建实例后,如果从实例上寻找某个属性值,如果属性值就存在于这个实例上,则会直接输出,否则就会从他的原型对象中去找。

  • prototype: 每个构造函数都有一个prototype属性,这个属性指向函数的原型对象。
  • __ proto__: 每个对象(除了null)都会有的属性,这个属性指向对象的原型。
  • constructor: 每个原型都有一个constructor属性,指向关联的构造函数。

下面我们用一组输出来验证这些信息:

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);
  }
}

当我们每次通过构造函数创建实例时,都会创建新的新的sayHello方法,如果创建的实例过多,就会造成性能浪费。此时如果将sayHello挂载到构造函数的prototype上,此时新创建的实例都可以访问到这个方法了。

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,张三;

什么是原型链

要解释这个问题,我们首先要理解好构造函数,原型和实例之间的关系:每个构造函数都有一个原型对象,原型对象都有一个指向其对应的构造函数的指针,而实例都包含一个指向原型对象的内部指针。

接下来,如果我们让原型对象同时等于一个其他的实例呢?

此时原型对象中包含一个指向其他原型的指针,另一个原型中也包含着一个指向另一个构造函数的指针。假如另一个原型又是另一个类型的实例,那么上述关系依然成立。如此层层递进,就构成了实例与原型的链条。就是我们常说的原型链。

简单来说,就是如果从实例上寻找某个属性值,如果属性值就存在于这个实例上,则会直接输出,否则就会从他的原型对象中去找。而原型对象中也没有的话,则会向原型对象的原型对象中去找。

以上就是通过手写instanceof理解原型链示例详解的详细内容,更多关于instanceof原型链理解的资料请关注脚本之家其它相关文章!

相关文章

  • 实例浅析js的this

    实例浅析js的this

    本文通过做几个简单的对照实验,根据这几个对照实验的结果,帮助大家理解js的this用法。下面就跟小编一起来看看吧
    2016-12-12
  • JS实现的对象去重功能示例

    JS实现的对象去重功能示例

    这篇文章主要介绍了JS实现的对象去重功能,结合实例形式分析了javascript针对json对象的遍历、判断、运算实现去重功能相关操作技巧,需要的朋友可以参考下
    2019-06-06
  • JavaScript实现动态添加、移除元素或属性的方法分析

    JavaScript实现动态添加、移除元素或属性的方法分析

    这篇文章主要介绍了JavaScript实现动态添加、移除元素的方法,结合实例形式分析了javascript针对页面元素动态添加、移除、设置等相关函数与使用技巧,需要的朋友可以参考下
    2019-01-01
  • 关于javascript中的promise的用法和注意事项(推荐)

    关于javascript中的promise的用法和注意事项(推荐)

    这篇文章主要介绍了关于javascript中的promise的用法和注意事项,需要的朋友可以参考下
    2021-01-01
  • JavaScript中子对象访问父对象的方式详解

    JavaScript中子对象访问父对象的方式详解

    js中虽然没有传统面向对象的编程语言里子类访问父类的特殊语法,但是我们可以根据需要造一个,接下来本文给大家分享在JavaScript中子对象访问父对象的方式,需要的朋友可以参考下
    2016-09-09
  • JavaScript中两个感叹号的作用说明

    JavaScript中两个感叹号的作用说明

    用两个感叹号的作用就在于,如果明确设置了o中flag的值(非null/undefined/0""/等值),自然test就会取跟o.flag一样的值;如果没有设置,test就会默认为false,而不是null或undefined
    2011-12-12
  • 使用JavaScript判断图片是否加载完成的三种实现方式

    使用JavaScript判断图片是否加载完成的三种实现方式

    有时需要获取图片的尺寸,这需要在图片加载完成以后才可以,本文有三个不错的实现方式在此与大家分享下
    2014-05-05
  • FF IE浏览器修改标签透明度的方法

    FF IE浏览器修改标签透明度的方法

    本文为大家介绍下FF IE浏览器修改标签透明度的方法,需要的朋友可以参考下
    2014-01-01
  • 微信小程序搭建自己的Https服务器

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

    这篇文章主要介绍了微信小程序搭建Https服务器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • RequireJS入门一之实现第一个例子

    RequireJS入门一之实现第一个例子

    RequireJS由James Burke创建,他也是AMD规范的创始人。大家知道我们为什么要学习requirejs吗?带着这个疑问来学习本篇文章吧,感兴趣的朋友一起学习RequireJS入门一之实现第一个例子吧
    2015-09-09

最新评论