原型链:
如果构造器有个原型对象A,则由该构造器创建的实例都必然复制于A。在JS中,对象实例并没有原型(但是有个不可见的__prototype__属性),而构造器(Constructor)有原型,属性“<构造器>.prototype”指向原型。
对象,可以说“构造自”某个原型,而不可说“拥有”某个原型。
function myFunc() {
var name = "stephenchan";
var age = 23;
function code() {
alert("Hello World!");
};
}
var obj = new myFunc();
//输出undefined,对象实例没有原型
alert(obj.prototype);
//输出myFunc的函数代码,obj由myFunc构造出来的
alert(obj.constructor);
//输出true
alert(obj.constructor == myFunc);
//输出[object Object],说明myFunc的原型是一个对象
alert(myFunc.prototype);
//输出function Function() { [native code] },[native code]的意思是JavaScript引擎的内置函数
alert(myFunc.constructor);
//输出true,函数原型的构造器默认是该函数
alert(myFunc.prototype.constructor == myFunc);
构造器与函数的概念是一致的,即代码中, myFunc就是一个构造器 ,因为通过new myFunc()就可以构造出一个对象实例了。
原型其实也是一个对象实例。再强调一下原型的含义是:如果构造器有个原型对象A,则由该构造器创建的实例(Object Instance)都必然复制于A,而且采用的读遍历机制复制的。读遍历复制的意思是:仅当写某个实例的成员时,将成员的信息复制到实例映像中。即当构造一个新的对象时,新对象里面的属性指向的是原型中的属性,读取对象实例的属性时,获取的是原型对象的属性值。而当对象实例对一个属性进行写操作时,才会将属性写到新对象实例的属性列表中。