2012-03-15 60 views
1
function A() { 
    this.B = function() { 
     var bla; 
    }; 
} 
A.B.prototype.foo = function() {console.log("Do whatever");}; 

我得到這個:如何在JavaScript中將函數添加到全局範圍內的函數原型中?

TypeError: Cannot read property 'prototype' of undefined

如何在這種情況下,一個功能添加到B的原型?

+2

調用後的賦值永遠不可能。如果你想設置'A.B',只需要執行'A.B = ...'。 – pimvdb 2012-03-15 19:40:14

+0

您是否瞭解'this'在JavaScript中的工作原理?如果您熟悉其他語言,則可能與您所假設的不同。 – 2012-03-15 19:43:39

回答

3

有一對夫婦在我們的代碼錯誤...這裏是如何:

function A() { 
    this.B = function() { 
     var blah; 
    }; 
} 

a = new A(); 
a.B.prototype.foo = function() {console.log("Do whatever")}; 

你的第一個問題是這樣做的:

this.B() = function... 

這不是有效的代碼,因爲你調用方法B併爲其分配一個函數,則必須引用該屬性。

您的其他錯誤是,沒有實例化一個「A」對象,該函數本身不能用作對象,它只能被調用。這就是爲什麼當你有:

A.B.prototype 

您收到該錯誤消息。

我希望能爲您解決一些問題,讓我知道您是否有更多疑問。

+0

謝謝。如果沒有口譯員,我仍然不習慣編寫完美的JavaScript。 :)此外,我最初希望避免使用A的實例到達B.是否可以安全地假設在這種情況下不可能在沒有A實例的情況下添加到B的原型? – MD3Sum 2012-03-15 19:46:59

+0

'a.B.prototype.foo'實際上不起作用。 http://jsfiddle.net/pLMvE/除非你做了'新的a.B'。 – 2012-03-15 19:47:38

+0

添加到我的評論,因爲您在評論寫作過程中回答: 再次感謝您。這是有道理的,但我只是想知道是否有Javascript魔法我不知道。乾杯。 ps>示例代碼錯誤已修復。 – MD3Sum 2012-03-15 19:48:45

0

BA的財產,只能從A的實例訪問。

var aObj = new A; 
aObj.B(); 

你不能沒有使用的A實例訪問A.B

您可以訪問aObj.B.prototype,併爲其添加方法。

aObj.B.prototype.foo = function(){ 
    return 'test'; 
}; 
var bar = new aObj.B; 
console.log(bar.foo()); // 'test' 

var bObj = new A; 
var foobar = new bObj.B; 
console.log(foobar.foo()); // `foo` is undefined 
0

你需要做的內部函數訪問將其添加到外的原型,那麼你可以通過使用Outer.prototype.Inner.prototype沒有立即需要的一個實例添加功能的內部對象外部物體。

function A() {this.a="a";} 
A.prototype.B = function() {this.b="b";} 
A.prototype.B.prototype.foo = function() {console.log("b is:"+this.b);} 
var a=new A(); 
var b=new a.B(); 
b.foo(); 
相關問題