JavaScript是面向对象的,每个实例对象都有一个__proto__属性,该属性指向它的原型对象,这个实例对象的构造函数有一个原型属性prototype,与实例的proto属性指向同一个对象。当一个对象在查找一个属性的时候,自身没有就会根据__proto__向它的原型进行查找,如果都没有,则向它的原型的原型继续查找,直到查到Object.prototype.proto_为null,这样也就形成了原型链。
原型对象和实例之间有什么作用呢?
通过一个构造函数创建出来的多个实例,如果都要添加一个方法,给每个实例去添加并不是一个明智的选择。这时就该用上原型了。
在实例的原型上添加一个方法,这个原型的所有实例便都有了这个方法。
var M = function (name) { this.name = name; } var o3 = new M('o3')
-
实例就是对象,在本例中o3就是实例,M就是构造函数。
-
实例通过new一个构造函数生成的。
-
从上图中可以知道,实例的proto指向的是原型对象。
-
实例的构造函数的prototype也是指向的原型对象。
-
原型对象的construor指向的是构造函数。
补充:
只有函数有prototype,对象是没有的。
但是函数也是有proto的,因为函数也是对象。函数的proto指向的是Function.prototype。