美文网首页JavaScript
我眼中的JS原型链

我眼中的JS原型链

作者: CodorMonkey | 来源:发表于2018-05-15 11:01 被阅读0次

原型链的知识,涉及到构造函数(constructor)、实例(instance)、原型对象(prototype),下面将一一讲解(最后还附带instanceof原理~)

什么是构造函数?

在JS中,任意函数都能当做构造函数,实际编码中,一般都有约定俗成的规范,例如:函数名首字母大写;函数名使用名词,而不是动词;一般只会用 new 的方式使用,不会直接调用;and so on...(编不下去了....)。

什么是实例?

一般指通过使用 new 构造函数(),返回的对象。

什么是原型对象?

原型对象没啥概念可讲,先看下面一段代码:

演示代码

构造函数.prototype,这个就是原型对象...

下面再上一张图

构造函数、实例、原型对象关系图

最后再来说说原型链,每个对象都有一个特殊的属性protoproto指向这个对象的构造函数的原型对象,以演示代码为例,Person是构造函数,p是实例对象,p.proto === Person.prototype为true(演示代码第7行),由于prototype即原型对象也是一个对象,它也有proto属性,这样就形成了一个链条,也就是原型链,原型链的顶端为Object.prototype。

原型链有什么用?

模拟继承,OOP的关键,暂时就讲这么多,以后再细讲。

instanceof原理
原理示意图

检测实例对象的原型对象与构造函数的原型是否是同一个对象,如果不是,根据实例对象的原型链依次查找,直到相等,或者到达原型链顶端。

上面文字可能表达的不是很清楚,下面上代码:

function myInstanceOf (obj, constructor) {
  // 对象的原型对象
  let objProto = Object.getPrototypeOf(obj);
  // 构造函数的原型对象
  let constructorProto = constructor.prototype;

  if (objProto === constructorProto) {
    return true;
  } else {
    while (objProto = Object.getPrototypeOf(objProto)) {
      if (objProto === constructorProto) {
        return true;
      }
    }
    return false;
  }
}

function Person (name) {
  this.name = name;
}

Person.prototype.hi = function () {
  console.log(`Hi, My name is ${this.name}`);
};

let p = new Person('Monkey');
p.hi();
console.log('------------------------------------------------');
let other = {name: 'Lucy'};

console.log(`p is myInstanceOf Person : ${myInstanceOf(p, Person)}`);
console.log(`p is myInstanceOf Object : ${myInstanceOf(p, Object)}`);
console.log(`other is myInstanceOf Person : ${myInstanceOf(other, Person)}`);
console.log(`other is myInstanceOf Object : ${myInstanceOf(other, Object)}`);
console.log('------------------------------------------------');
console.log(`p is instanceof Person : ${myInstanceOf(p, Person)}`);
console.log(`p is instanceof Object : ${myInstanceOf(p, Object)}`);
console.log(`other is instanceof Person : ${myInstanceOf(other, Person)}`);
console.log(`other is instanceof Object : ${myInstanceOf(other, Object)}`);</pre>

使用myInstanceOf和instanceof的结果是一致的

相关文章

  • 我眼中的JS原型链

    原型链的知识,涉及到构造函数(constructor)、实例(instance)、原型对象(prototype),...

  • 廖雪峰JS小记

    (function(){})() 原型,原型链 浅谈Js原型的理解JS 原型与原型链终极详解 对象 对象:一种无序...

  • JS的__proto__和prototype

    最近在回顾JS的原型和原型链的知识,熟悉JS的同学都知道JS的继承是靠原型链实现的,那跟原型链相关的属性__pro...

  • 从实现角度分析js原型链

    从实现角度分析js原型链 欢迎来我的博客阅读:《从实现角度分析js原型链》 网上介绍原型链的优质文章已经有很多了,...

  • Javascript(三)之原型继承理解

    进阶路线 3 原型继承 3.1 优秀文章 最详尽的 JS 原型与原型链终极详解 一 最详尽的 JS 原型与原型链终...

  • JS原型链

    1什么是JS原型链? 通过__proto__属性将对象与原型对象进行连接. 1.1 JS原型链的作用? 组成的一个...

  • JS闭包问题(一)

    之前我写过一篇JavaScript原型与原型链的文章,此属于JS中的重难点。 而闭包,是JS中除了原型链之外又一个...

  • 关于JS中的原型和原型链

    目录 关于js 对象和原型 原型链 基于原型链的继承 参考资料ECMAScript 6 入门JavaScript原...

  • js_继承及原型链等(四)

    js_继承及原型链等(三) 1. 继承 依赖于原型链来完成的继承 发生在对象与对象之间 原型链,如下: ==原型链...

  • JavaScript原型链

    js原型链 原型链是JS面向对象的基础非常重要 所有对象只有__proto__属性,而函数具有prototype属...

网友评论

    本文标题:我眼中的JS原型链

    本文链接:https://www.haomeiwen.com/subject/zijedftx.html