日期:2014-05-16 浏览次数:20469 次
原文地址:http://blog.endlesscode.com/2010/01/23/javascript-prototype-chain/
原型的含义是指:如果构造器有个原型对象A,则由该构造器创建的实例(Object Instance)都必然复制于A。““在JavaScript中,对象实例(Object Instance)并没有原型,而构造器(Constructor)有原型,属性’<构造器>.prototype’指向原型。对象只有“构 造自某个原型”的问题,并不存在“持有(或拥有)某个原型”的问题。””如何理解这一句话?
代码1:
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);
构造器与函数的概念是一致的,即代码1中,myFunc就是一个构造器,因为通过new myFunc()就可以构造出一个对象实例了。因此,”alert(obj.prototype)”输出undefined说明了对象实例是没有原型的,”alert(myFunc.prototype)”输出[object Object]说明了构造器有原型,而“obj.constructor==myFunc”返回true说明obj的构造器是myFunc。
原型其实也是一个对象实例。再强调一下原型的含义是:如果构造器有个原型对象A,则由该构造器创建的实例 (Object Instance)都必然复制于A,而且采用的读遍历机制复制的。读遍历复制的意思是:仅当写某个实例的成员时,将成员的信息复制到实例映像中。即当构造 一个新的对象时,新对象里面的属性指向的是原型中的属性,读取对象实例的属性时,获取的是原型对象的属性值。而当对象实例对一个属性进行写操作时,才会将 属性写到新对象实例的属性列表中。
图1 JavaScript使用读遍历机制实现的原型继承
代码2:
Object.prototype.value = "abc"; var obj1 = new Object(); var obj2 = new Object(); obj2.value = 10; //输出abc,读取的是原型Object中的value alert(obj1.value); //输出10,读取的是obj2成员列表中的value alert(obj2.value); //删除obj2中的value,即在obj2的成员列表中将value删除掉 delete obj2.value; //输出abc,读取的是原型Object中的value alert(obj2.value);
图1是对代码2的描述,说明读遍历机制是如何在成员列表以至原型中管理对象成员的。只有对属性进行第一次写操作的时候,才会在对象的成员列表中添加 该属性的记录。当obj1和obj2通过new来构造出来的时候,仍然是一个指向原型的引用,在操作过程中也没有与原型相同大小的对象实例创建出来。这样 的读遍历就避免在创建新对象实例时可能的大量内存分配。当obj2.value属性被赋值为10的时候,obj2则在其成员表中添加了一个value成 员,并赋值为10,这个成员表就是记录了obj2中发生了修改的成员名、值与类型。这张表是否与原型一致并不重要,只需要遵循两条规则:(1)保证在读取 时被首先访问到。(2)如果在对象中没有指定的属性,则尝试遍历对象的整个原型链,直到原型为空或找到该属性。代码2中的delete操作是将obj2成 员表中的value删除了,因此在读取obj2的value属性的时候就遍历到Object中读取。
函数的原型总是一个标准的、系统内置的Object()构造器的实例,不过该实例创建后constructor属性总先被赋值为当前的函数。