原型
在Js中每个对象都有一个与之相关联的对象,叫原型对象。每一次获取对象属性都是查询的过程,当对象的自有属性好啊不到时就会去找它的原型对象。 在JS函数也是一个对象,每个函数都有prototype属性(只有函数有prototype属性),这个是一个指针,也是一个对象,二者对象的用途是包含可以由特定类型的所有实例共享的属性和方法。 每个函数都有prototype属性,指向函数的原型对象。他们的实例对象可以共享这个属性,实例和原型对象关联起来所用的属性叫做_proto_(([prototype])),它也是一个指针,指向构造函数的原型对象,就是我们能够共享信息的那个对象。
prototype
对象均有一个prototype内置属性,该属性非空。默认是null。通过ES5语法Object.create()可以继承一个对象(通过原型继承),普通的prototype最终都会指向最终的Object.prototype对象
属性设置和屏蔽
给对象添加属性经过: myObject.foo=“bar”
- 如果myObject对象包含名为foo的普通数据访问属性,这条赋值语句只会修改已有的属性
- 如果foo不直接存在于myObject中,prototype链会被遍历,找不到foo,foo会直接添加到myObject
- 如果foo出现在myObject在原型链上层,那么新添加的foo属性会屏蔽掉上层所有的foo属性;如果在prototype链上层存在foo并且它是一个setter,那么foo不会添加到myObject中。
- 注意myObject++等操作,++相当于myObject=myObject+1,进行了一次复制操作,所以会缠上隐式屏蔽
“类”函数
- JavaScript才是真正的面向对象语言,不通过类,直接创建对象的语言。JavaScript是通过函数在模仿类的特性,因为函数会拥有一种prototype的公有且不可枚举的属性,它会指向这个函数的原型,通过.prototype来访问。
- 通过new创建的对象最终会被[[prototype]]链接到原函数.prototype上
- 类可以被复制(实例化多次),一个类就意味着把类的行为复制到物理对象中,对于每一个实例都会重复这个过程。但是在JavaScript并没有类似的复制机制。通过prototype关联同一个对象,默认情况不会复制,而是互相关联。new其实就是生成一个新对象,这个对象的内部链接[[prototype]]关联着原函数的prototype对象。最后我们得到了两个对象,它们只是相互关联。这就叫作原型继承。
- Js的原型继承会在两个对象之间创建关联,这样一个对象可以通过委托另一个对象的属性和函数。
|