2010-09-25 24 views
0

我在JavaScript中繼承實驗,並寫了這兩個功能:對象在Javascript中如何引用它自己?

Object.prototype.inherits=function(obj){this.prototype=new obj;} 
Object.prototype.pass=function(obj){obj.prototype=new this;} 

此代碼的工作非常好:

Dog.inherits(Animal); 

但下列失敗:

Animal.pass(Dog); 

正如我理解它,我的傳遞函數不起作用,因爲「this」不是對象實例本身的引用?如果是這樣的話,我該如何從內部引用對象?

在此先感謝!

回答

1

嗯,其實兩個正在做完全一樣:

Dog.prototype = new Animal; 

方法內的this值將是指其中被調用的參考基礎對象,在的情況下:

Dog.inherits(Animal); 

this值將參考Dog的構造函數,並且obj參數將爲Animal有趣ction。

當你撥打:

Animal.pass(Dog); 

this值將參照Animal功能,在結束完全同樣的事情inherits方法做,但周圍的其他方式。

我會建議你延長Object.prototype對象,因爲它可能會導致你很多的問題,比如這兩個屬性在任何for-in循環中枚舉,如:

for (var prop in {}) { // <-- an empty object! 
    alert(prop); // will alert 'inherits' and 'pass' 
} 

所有對象從Object.prototype繼承,並且您打算僅在Function對象上使用這些方法,因此擴展對象或將這些方法實現爲帶有兩個參數的函數會更安全。

+0

是的,這兩個功能都正常工作,我猜測我犯了一個錯誤,當我測試它...感謝您的建議。 – Alex 2010-09-25 20:17:36

1

對我的作品,帶有測試代碼,如:

function Animal() {} 
Animal.prototype.isanimal= 1; 
function Dog() {} 
Animal.pass(Dog); 
Dog.prototype.isdog= 2; 
alert(new Dog().isanimal); // 1 
alert(new Dog().isdog); // 2 

但是,請記住,new thisnew obj會調用該函數this/obj,創建一個新的完整實例。如果你在那個函數中有構造函數代碼來接收一些參數,或者設置了實例狀態,那麼你最終會遇到問題。

function nonconstructor() {} 
nonconstructor.prototype= this.prototype; 
obj.prototype= new nonconstructor(); 

此外,你應該避免原型到Object:不必呼叫this,你可以使用不同的構造函數,什麼都不做的函數創建一個新的this。這會導致使用Object作爲通用查找映射的代碼出現問題。由於您似乎只使用構造函數,所以原型應用於Function應該能夠滿足您的需求,並且更安全。

+0

還沒有意識到這個(潛在的)問題,謝謝! – Alex 2010-09-25 20:24:27