1. __proto__
属性
-
作用
对象可以通过调用隐式属性__proto__
查看原型
__proto__
是每个对象被创建时自带的一个隐式属性 -
备注
当一个对象被访问其内在的一个属性的时候,
若该属性在对象本身并不存在, 则会通过__proto__
来找到该对象的原型,
然后再在该对象的原型中寻找是否有这个属性,
若该对象的原型中也没有这个属性, 就会往上一级的原型去找, 即原型的原型去找,
直到寻找到最高级父类 Object 为止.
__proto__
在这之中充当了连接器, 来寻找以及连接对象的原型.
2. 原型属性在子对象中的存放
-
存放原理
一个对象通过含有原型的构造器创建出来时,
原型的属性并非直接存放于该对象内,
而是只有当外部进行访问该对象内的原型属性时,
通过__proto__
来去连接对象的原型进行获取的,
因此对象的原型可以被修改, 修改后的对象拥有新原型的属性. -
如下所示
首先, 创建一个父类构造函数.
然后, 给原型增加属性,
接着, 创建一个子对象 child01,
通过直接输出可见, child01 里面并没有存放原型中的属性,
只有__proto__
属性用以连接原型,
但是实际访问这些原型属性, 是可以访问的出来的.
3. 原型链
- 原型链相当于多重继承, 即对象可以通过继承含有原型的原型来获得父原型和祖父原型的属性,
这个过程可以一直递增, 因此形成了一条原型链
4. Object 类
-
Object 类是最高级的父类, 它的原型是最终原型,
在Object.prototype
中是找不到__proto__
的, 因为是最终原型
因此Object.prototype.__proto__
的结果是null
-
绝大多数的对象最终都会继承自
Object.prototype
-
可以用
Object.create(原型)
来创建对象
如下所示,
通过这种方法创建出来的 child 对象也可以获得 Obj 的属性
var Obj = {
name:'name',
age:17
}
var child = Object.create(Obj);
- 可以通过
Object.create(null)
创建出没有原型的对象