什么是原型?
其实我们创建的每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象,这个对象就 是原型对象。这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。
每一个对象都有一个默认的原型。原型本身就是对象。这个对象也有原型。
原型属性和实例属性
实例属性:
1、构造函数通过this关键字定义的属性
2、构造函数通过var关键字定义的属性
3、对象动态添加的属性
原型属性:
构造函数的原型对象添加的属性
原型链是什么?
原型链就是当从一个对象那里调取属性或方法时,如果该对象自身不存在这样的属性或方法, 就会去自己关联的prototype对象那里寻找,如果prototype没有,就会去prototype关联的前辈 prototype那里寻找,如果再没有则继续查找 Prototype.Prototype引用的对象,依次类推,直到 Prototype.….Prototype为undefined(Object的Prototype就是undefined)从而形成了所谓 的“原型链”。
为了更好地理解原型链,我为大家画了以下一图,望能帮助大家:
原型链和构造函数
JavaScript是一种面向对象的语言,并且可以进行原型继承。
JavaScript中的函数有一个属性prototype
,这个prototype
属性是一个对象,它的一个属 性constructor
引用该函数自身。即:
func.prototype.constructor === Person; // ==> true
这个属性有什么用呢?我们知道一个,一个函数使用new
操作符调用时,会作为构造函数返回一个 新 的对象。这个对象的_proto_
属性引用其构造函数的prototype
属性。
因此这个就不难理解了:
var obj = new Person(); obj.constructor == Person; // ==> true
还有这个:
obj instanceof Person; // ==> true
也是通过查找原型链上的constructor
属性实现的。
构造函数生成的不同实例的_proto_
属性是对同一个prototype
对象的引用。所以修改prototype
对象会影响所有的实例。