抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

理解原型链

  1. 理解new关键字的作用机制(写)
  2. 理解[[GET]](读)

new的执行流程

1
2
3
4
5
6
function foo() {
console.log(1);
}

const a = new foo(); // 第二步用代码表示:this.__proto__ = foo.prototype; 返回值:this指向的对象的引用
console.log(a);

new的执行流程

  1. 绑定this为空对象
  2. 让空对象[[Prototype]](__protot__) –> 函数的prototype属性
    (1) 所有对象都有[[Prototype]](隐式属性 __protot__) -> 所有对象本质上都是new出来的
    (2) 所有的函数对象 -> prototype
  3. 正常执行函数
  4. 如果函数返回的基本类型,返回this的值,否则返回原函数的返回值

[[GET]]

1
2
3
4
5
6
7
function foo() {
console.log(1);
}

const a = new foo();
a.b // 不报错返回undefined
console.log(a.b) // 访问对象属性的本质,底层帮调用

[[GET]]流程

  1. 判断对象里面有没有
  2. 判断它的__proto__指向的对象里面有没有

面试题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Object.prototype.a = function () {
console.log('a');
};

Function.prototype.b = function () {
console.log('b');
};

var F = new function() { };
var f = new F();

console.log(f.a) // 打印a
console.log(f.a) // 打印undefined
console.log(F.a) // 打印a
console.log(F.b) // 打印b

原型链的终点是:Object.prototype.[[prototype]] = null

  • Object.prototype.__proto__ = null; // 不是所有对象都是Object的实例
  • Function.prototype.__proto__ = Object.prototype; // new Object()
  • Object.__proto__ = Function.prototype; // new Funtion()
  • Function.__proto__ = Function.prototype

评论