Javascript之prototype
文献
[1] http://www.myowndb.com/blog/?p=26
当一个函数被设计来跟new一起使用的时候,称为构造器constructor。
因为javascript一方面想跟传统的对象创建方法接近,一方面又想有自己的特点,所以javascript使用构造器的方式比较奇怪。
当函数被创建的时候,会被赋给一个prototype成员,prototype是一个对象,该对象包含一个constructor成员,construtor成员指向该函数。并且这个prototype是用来扩展继承于它的对象的重要方法。就目前能看到的情况而言,除了constructor,prototype好像没有预定义什么属性,也许还存在其他的预定义属性。
可以将其他成员member加到该函数的prototype中。当函数被new调用创建一个新的对象的时候,这些成员都会被连接link into到这个新对象。
这样可以在没有事先扩展新对象的情况下,通过prototype来添加新的constants和methods。
假设与问题:
prototype是一个对象,或者准确地说应该是一个对象指针?
为什么prototype能实现继承机制?
当在当前对象寻找某个属性失败的时候,ECMAScript会在当前对象的prototype指向的对象中继续寻找该属性,以此类推。所以在当前对象调用作为其原型prototype的对象里的属性的时候是可以成功的,所以说当前对象继承了其原型对象的属性,亦即实现了继承机制。
关于创建新对象时发生的事情:
当创建一个新对象的时候,该对象的prototype将指向创建该对象的函数的prototype指向的对象。因此,考虑下面的代码:
function fConstructor()
{}
fConstructor.prototype.mMethod = function mMethod{};
function fNewConstructor()
{}
var oNew = new fConstructor{};
//change the point of prototype
fConstructor.prototype = new fNewConstructor{};
这时,虽然mMethod指向被改变了,但是因为对象oNew的创建在这个改变之前,所以oNew.prototype已经指向了改变之前的,从fConstructor中获取的prototype,并且将继续指向。所以,mMethod的改变对已经创建的对象没有影响,但是会影响下面创建的对象。也是基于oNew.prototype指向了fConstrutor中获取的prototype,如果在创建了对象oNew之后,再改变比如fConstructor.prototype.mMethod指向的函数的话,oNew的mMethod也会改变成新的mMethod。