prototype 和 __proto__ 有什么区别?
请说明 prototype 和 proto 的区别,以及它们之间的关系。
回答
古法程序员
| 属性 | prototype | proto |
|---|---|---|
| 拥有者 | 函数(Function) | 所有对象(Object) |
| 作用 | 存放共享属性和方法,供实例继承 | 指向创建该对象的构造函数的 prototype |
| 标准 | 标准属性,ES 规范定义 | 非标准属性(但广泛实现),标准方法为 Object.getPrototypeOf() |
| 修改 | 可修改(影响所有实例) | 可修改(不建议,性能差) |
关系:
function F() {}
const f = new F();
f.__proto__ === F.prototype // true
F.prototype.constructor === F // true
F.__proto__ === Function.prototype // true(构造函数是 Function 的实例)
Function.prototype.__proto__ === Object.prototype // true
Object.prototype.__proto__ === null // true(原型链终点)
关键记忆:
- 函数有
prototype(给实例用)也有__proto__(自己是对象) - 对象只有
__proto__(继承用),没有prototype(仅函数有) Object、Array、Function都是构造函数,所以都有prototype