在javascript中的所有变量与U对象,我们都可以认为是直接或间接的new某个函数来创建的。
构造函数:被new的函数,称为对象的构造函数。
原型对象:构造函数上有一个prototype属性,称为对象的原型对象。所有通过new出来的实例(对象)都会共享原型对象上的方法和属性。
例如:
var arr = new Array(); // Array()是构造函数, arr是实例(对象)
Array.prototype.a = 1; // Array.prototype是原型对象
console.log(arr.a); // 结果是:1, arr共享原型对象上的方法和属性
对象在调用一个方法时会首先在自身里寻找是否有该方法,若没有,则去原型链上去找它的原型,找不到,再继续找原型的原型,依次层层递进。
原型链:原型对象之间形成了一条链条。例如上述例子中,使用数组中的方法时,会先去Array.prototype上找有没有,然后再去它原型对象的原型对象Object.prototype上去找,如果没找到,就去Object的原型的原型null上去找。这样就形成了一条原型链。
例如:
var arr = new Array();
Object.prototype.b = 2;
Array.prototype.a = 1;
console.log(arr.b); // 2
// 输出arr.b是先去Array.prototype找有没有属性b,再去Object.prototype找
原型对象是指原型所指向的对象,例如:数组的原型对象就是Array.prototype所指向的对象。
原型对象中都会有默认的constructor属性来指向函数本身。例如array.constructor结果为其构造函数Array()。
原型对象与原型链主要用来实现继承。
实例,构造函数与原型对象的结构图为: