- 原型链是实现继承的主要方法(
_proto_
的引用链), 即让一个引用类型继承另一个引用类型的属性和方法
原型链.png
- 注意有三个关键词:
-
prototype
构造函数具有 -
constructor
原型对象具有 -
_proto_
实例对象具有
-
原型对象、构造函数、实例对象.png
每个实例对象Object
都有一个私有属性_proto_
指向它的原型对象prototype
。 该原型对象也有一个自己的原型对象,层层向上直到一个对象的的原型对象为null.
null没有原型,是原型链最后一个环节。
function SuperType(){ this.property=true; } // 构造函数 对象
SuperType.prototype.getSuperValue=function(){return this.property;}
function SubType(){ } //构造函数 对象
SubType.prototype = new SuperType(); //原型 此时的指针是[[prototype]]
var instance = new SubType(); //实例
[[prototype]]默认情况下不可以再被外部访问,但会被for..in等遍历原型链上可以被枚举的属性的时候访问
两个对象之间实现了继承,方式:创建`SuperType`的实例 及重定义`SubType.prototype` 。本质是重写了原型对象.png
结论:
- 创建一个函数,这个函数就立即拥有属性
prototype
。 即prototype
属性存在函数中,指向的是原型对象- 函数的
prototype
对象具有属性constructor
, 且指向该函数自身
fun.prototype.constructor === func
结论为 true- 函数实例的
contructor
指向函数本身
var obj = new Fuc(); obj.constructor == Func;
- JavaScript每个对象,都有一个内置的
_proto_
属性
obj instanceof Func
结论为true- JavaScript 对象的内部属性——
_proto
_属性,函数也是对象
原形脸最终指向
- 函数对象的原型链最终指向
Function prototype
对象 - 非函数对象的原型链最终指向
Object prototype
对象 Function prototype
对象的_proto_
属性也指向Object prototype
对象Object prototype
对象的_proto_
属性指向null
原型链的指向.png
函数F的原型链相关属性解释.png
创建对象
- new方法构建
- 分配内存作为新创建的对象
- 将新创建的对象的
_proto_
属性指向函数F的原型对象
new方法创建实例,生成的原型链图.png
- 对象字面量
- 分配内存作为新创建的对象
- 将新创建对象的
_proto_
属性指向Object prototype object
对象字面量创建实例对象,生成原型链图.png