`

Javascript之prototype

 
阅读更多

Javascriptprototype

文献

<!--[if !supportLists]-->[1] <!--[endif]-->http://www.myowndb.com/blog/?p=26

当一个函数被设计来跟new一起使用的时候,称为构造器constructor

因为javascript一方面想跟传统的对象创建方法接近,一方面又想有自己的特点,所以javascript使用构造器的方式比较奇怪。

当函数被创建的时候,会被赋给一个prototype成员,prototype是一个对象,该对象包含一个constructor成员,construtor成员指向该函数。并且这个prototype是用来扩展继承于它的对象的重要方法。就目前能看到的情况而言,除了constructorprototype好像没有预定义什么属性,也许还存在其他的预定义属性。

可以将其他成员member加到该函数的prototype中。当函数被new调用创建一个新的对象的时候,这些成员都会被连接link into到这个新对象。

这样可以在没有事先扩展新对象的情况下,通过prototype来添加新的constantsmethods

假设与问题:

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指向的函数的话,oNewmMethod也会改变成新的mMethod

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics