JS 对象的 __proto__
- 所有的引用类型(数组、对象、函数),都有一个
__proto__属性,属性值是一个普通的对象 - 所有的函数,都有一个 prototype 属性,属性值也是一个普通的对象
- 所有的引用类型(数组、对象、函数),
__proto__属性值指向它的构造函数的 prototype 属性值
注:ES6 的箭头函数没有prototype属性,但是有__proto__属性。
1 | const obj = {}; |
原型
题目:如何理解 JS 中的原型?
1 | // 构造函数 |
但是执行alertName时发生了什么?这里再记住一个重点 当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么会去它的**__proto__(即它的构造函数的prototype**)中寻找,因此f.alertName就会找到Foo.prototype.alertName。
原型链
题目:如何 JS 中的原型链?
以上一题为基础,如果调用f.toString()。
f试图从__proto__中寻找(即Foo.prototype),还是没找到toString()方法。- 继续向上找,从
f.__proto__.__proto__中寻找(即Foo.prototype.__proto__中)。因为Foo.prototype就是一个普通对象,因此Foo.prototype.__proto__ = Object.prototype - 最终对应到了
Object.prototype.toString
这是对深度遍历的过程,寻找的依据就是一个链式结构,所以叫做“原型链”。
instanceof 实现
instanceof是通过原型链来进行判断的,所以只要不断地通过访问__proto__,就可以拿到构造函数的原型prototype。直到null停止。
1 | /** |
new 操作符实现
做之前,得懂:
- apply的用法
__proto__和函数prototype属性的关系
实现方法:
1 | function mynew(Func, ...args) { |