理解原型和原型链
[[Prototype]]
理解原型的概念首先要理解 [[Prototype]]
:
所有的对象都有一个内置属性[[Prototype]]
,而这个属性是对其他对象的引用, 例子如下:
Object.create()
,参数是个指定对象,这个函数的作用是创建一个对象,并且把这个对象的[[Prototype]]
关联到指定的对象。
for in
和 in
都是通过查找[[Prototype]]
链的方式来枚举和判断属性是否存在。
而[[Prototype]]
的尽头就是Object.prototype
"类"函数
前面既然已经说过了,每个对象都有一个内置属性[[prototype]]
, 现在我们来看new
操作符来生成一个实例的过程,如new Foo()
new Foo()
会生成一个新函数,这个对象的内置[[prototype]]
关联的是Foo.prototype
对象
javaScript中对构造函数最准确的理解是:所有带有"new"的函数调用(因为随便哪个函数都可以使用new来创建一个对象)。
检查"类"的关系
intanceof
intanceof
,左边是对象,右边是函数。a instanceof Foo表示在a的整条[[prototype]]链中是否有指向Foo.prototype的对象isPrototypeOf()
,左边是对象右边是对象。b.isPrototypeOf©; 问的就是b是否出现在c的[[prototype]]链中。- 在ES5中,直接获取一个对象的[[prototype]],标准方法是:
Object.getPrototypeOf( );
- 绝大多数浏览器都可以使用一个非标准的方法来访问对象的内部[[prototype]]属性:
a.__proto__ === Foo.prototype; // true
对象关联
b = Object.create(a) 会创建一个新对象并把它关联([[prototype]])到我们指定的对象
Object.create(null)创建的对象的[[prototype]]指向的是空,这个对象无法进行委托,也没有原型链,空[[prototype]]的对象通常被称为"字典",它们完全不会受到原型链的干扰,因此非常适合用来存储数据。