Javascript中的原型
原型
首先可以通过__proto__
属性来查看对象的原型是什么,
那么这个对象的原型怎么来的,通过构造函数上的prototype
属性来定义,
普通对象是没有prototype
属性的
需要特别分清楚的是:一个对象的原型不等于自己的prototype属性,而是等于它的构造函数的prototype属性,很长时间,我对这个概念的理解是混乱的,上代码说明
首先要确定哪些东西是语言定义的,(或者说是说死的,不要问为什么)
prototype
而哪些东西是根据语法规则产生的
Function类型对象:
有prototype属性,他的prototype属性默认是
1 | constructor: 他自己 |
比如:
1 | function A() {} |
Object对象本身是个Function类型对象,他是有prototype属性的,而prototype属性上挂的属性和方法就会???
1 | a.__proto__ === obj.constructor.prototype === A.prototype |
Object类型对象 全都是通过构造函数生成的,他是有原型的,但是没有prototype属性
function A() {}
var a = new A();
由于JavaScript的所有对象都是通过构造函数生成的,而所有构造函数都有prototype属性(其实是所有函数都有prototype属性),所以所有对象都有自己的prototype原型对象。
因此,一个对象的属性和方法,有可能是定义它自身上面,也有可能定义在它的原型对象上面。由于原型本身也是对象,又有自己的原型,所以形成了一条原型链(prototype chain)。
比如,a对象是b对象的原型,b对象是c对象的原型,以此类推。
因为追根溯源,
最源头的对象都是从Object构造函数生成(使用new Object()命令),
所以如果一层层地上溯,所有对象的原型最终都可以上溯到Object.prototype。
那么,Object.prototype有没有原型呢?
回答可以是有,也可以是没有,
因为Object.prototype的原型是没有任何属性和方法的null。
Object.prototype对象的原型是null,由于null没有任何属性,所以原型链到此为止。
1 | Object.getPrototypeOf (); |
最简单的情况:一个对象的原型是在其构造函数的prototype属性上
妈蛋!!!
好乱啊
2016-03-09