理解JavaScript中的原型和原型链
基础概念
- 对象
- 函数对象
- 原型对象
下图摘取自彻底理解JavaScript原型
原型
每个对象都有
__proto__
属性,对应对象的原型__proto__
属性是非标准的访问器。只有部分浏览器提供了这个属性。函数对象都有
prototype
属性,该属性的值会被赋值给该函数创建的对象的__proto__
属性原型对象有
constructor
属性,这个属性对应创建所有指向该原型的实例的构造函数{}
创建的对象的原型是Object
原型链
因为每个对象和原型都有原型,对象的原型指向对象的父,而父的原型又指向父的父,这种原型层层连接起来的就构成了原型链。
用原型实现继承
1 | function Foo() { |
Or
1 | function Animal() { } |
请注意差别:
1 | function Foo() { |
这是由new
和Object.create()
的差别引起。
1 | Very simply said, new X is Object.create(X.prototype) with additionally running the constructor function. (And giving the constructor the chance to return the actual object that should be the result of the expression instead of this.) |
摘自Understanding the difference between Object.create() and new SomeFunction()
常见问题
__proto__
和prototype
是同一个东西吗?不是!
每个对象都有
__proto__
属性,它对应该对象的原型。只有函数对象才有
prototype
属性,当一个函数被用作构造函数来创建实例时,该函数的prototype属性值将被作为原型赋值给所有对象实例(也就是设置实例的__proto__
属性)。但是
Function.prototype === Function.__proto__
为true
。