JavaScriptjavascript深入JavaScript

深入JavaScript Day11 - 彻底理解原型链 fun

2022-01-19  本文已影响0人  望穿秋水小作坊

一、function、Function、prototype、constructor 概念理解

1、var obj1 = {};是什么代码的语法糖?

var obj2 = new Object();

console.log(obj2.__proto__ === obj1.__proto__); // true ;new出来的实例,【__proto__】 指向函数的【prototype】
console.log(obj2.__proto__ === Object.prototype); // true ;new出来的实例,【__proto__】 指向函数的【prototype】

2、function Foo(){};代码有什么作用?可以看成什么代码的语法糖?

// console.log(function Foo() {}.constructor === Function); //ture  证明函数都是Function的实例对象
// 可以看成如下代码的语法糖
var Foo = new Function();
console.log(Foo.constructor === Function); // ture 证明函数都是Function的实例对象

3、【重点】prototype属性在哪里出现?

function Foo() {
  this.name = "why";
}
console.log(Foo.prototype); // {constructor: ƒ Foo()}

var obj = { name: "why" };
console.log(obj.prototype); // undefined

4、【重点】constructor属性在哪里出现?指向什么?

function Foo() {
  this.name = "why";
}
console.log(new Foo.prototype.constructor()); // Foo {name: 'why'}

5、【重点】Foo是一个对象吗?Foo.__proto__Foo.prototype 相等吗?

二、练习验证对原型链的理解?

1、下面的代码,请绘制出内存结构图(Foo、Foo.prototype、Function、Function.prototype、Object、Object.prototype)?

function Foo() {}
image.png

2、能理解下面的图?

image.png

三、补充一些方法

1、学完原型链就可以手写 instanceof 的实现了?

// 思路:顺着原型查找,知道找到相同的原型对象,返回true 否则返回false
function myInstanceof(left, right) {
  // 使用typeof 判断基础数据类型
  if (typeof left !== 'object' || left === null) {
    return false;
  }
  // getPrototypeOf是Object对象自带的API,获取原型对象
  let proto = Object.getPrototypeOf(left);
  while (true) {
    if (proto === null) {
      return false;
    }
    // 找到相同原型对象,返回true
    if (proto === right.prototype) {
      return true
    }
    proto = Object.getPrototypeOf(proto);
  }
}

2、如何判断stu1是Person的子类实例?

image.png
上一篇 下一篇

猜你喜欢

热点阅读