2009-12-28 57 views
2

我一直在嘗試javascript中的一些基礎知識,這裏是我觀察到的。在Javascript中使用函數分配進行原型設計

我寫函數對象的原型修改方法

Function.prototype.method = function(name, func) 
{ 
    this.prototype[name] = func; 
    return this; 
} 

function pirates(value) 
{ 
    console.log("I just throw away the value!!" + value); 
} 

pirates.method("my_skill", function(){ 
    console.log("Pirate skills"); 
}); 

new_pirate = new pirates(1234); 

//SUCCESS 
new_pirate.my_skill(); //prints "Pirate skills" 

var someCrappyVariable = function(){ 
    return function() 
    { 
    console.log("I am going to just sit and do nothing. Really!"); 
    } 
}(); 

**//Throws error. WHY???????? This was assigned a function, so ideally prototype should work on this too? Shouldn't it?** 
someCrappyVariable.method("crappyFunction", function(){ 
    console.log("am I doomed?"); 
}); 

爲什麼最後分配引發一個錯誤someCrappyVariable不是一個函數,當它被賦予的功能較早參考?我很困惑。

乾杯

+0

嘗試執行'crappyFunction'方法時出現錯誤 – 2009-12-28 21:04:09

回答

2

您的代碼應該在這裏拋出一個錯誤:

new_pirate.method("my_skill", function(){ 
    console.log("Pirate skills"); 
}); 
// TypeError: new_pirate.method is not a function 

...因爲method不是直接或繼承的方法。從new pirates(1234)創建的對象不會從Function繼承;它將繼承Object,理想情況下,它不應使用自定義方法進行擴展)。

+0

它不起作用,如上所述。它真的在「my_skill」上引發錯誤。 – artificialidiot 2009-12-28 19:08:10

+0

這一點是正確的。因此,我認爲我的someCrappyVariable也無法繼承原型方法的問題在於,它是從對象繼承而不是從函數繼承。 爲什麼它會繼承對象?我們沒有給它分配一個函數嗎? – Priyank 2009-12-28 19:11:21

+0

new通過新創建的對象調用作爲構造函數方法的函數。你的代碼中還有一個錯誤,我將作爲答案發布。 – artificialidiot 2009-12-28 19:44:03

-1

如果我們刪除「new_pirate」的代碼,仍然有錯誤。

在標準js中,可以通過在運行之前分配構造函數的原型屬性來創建對象的原型鏈,並創建該對象。所以如果你在someCrappyVariable上調用「方法」,它只會在創建對象的「prototype」屬性上設置「名稱」,這幾乎是無用的。

你所需要做的就是設置someCrappyVariable.constructor.prototype [name],這樣所有具有相同構造函數的對象都可以像someCrappyVariable [name](在這種情況下由匿名函數創建)那樣找到set方法。