2011-04-06 58 views
3

如何JQuery的處理問題「未定義的無法設置屬性XXX」「如果我有:jQuery是如何工作的:在嘗試類似的原型時,我得到「Can not set property xxx of undefined」?

function Foo() { 
    Foo.fn = Foo.prototype; 
} 

然後,我有一個擴展JavaScript文件與此代碼:

(function(foo) { 
    foo.fn.myPlugin = function() { 
     //return something here 
    }; 
})(Foo); 

我得到一個錯誤說「無法設置的未定義的屬性爲myplugin」滑稽不夠的,如果我只是插件代碼複製到螢火或Chrome並在控制檯中執行它,它工作正常,重視並如預期一樣工作:

foo.myPlugin(); 

我猜我的問題要麼來自瀏覽器加載文檔的時間,要麼是我現有的對象不在它自己的命名空間內。我想知道這是否僅適用於使用var語法定義類時?

我不知道...從我的理解...或者應該工作。

+0

如果您問爲什麼您的代碼無法正常工作,您可能需要更改標題。 jQuery沒有「不能設置未定義的屬性xxx」問題,至少不是我所知。 – jdigital 2011-04-06 21:44:36

+0

我實際上在問jQuery是如何工作的......也許我的標題很混亂,我會看看我是否可以改變它。 – farina 2011-04-07 20:31:01

回答

1
function Baz() { 
    return this; 
} 
Baz.prototype.fn = Baz.prototype; 
var Foo = new Baz(); 
Baz = null; 
(function(Bar) { 
    Bar.fn.myPlugin = function() { 
     return "test"; 
    }; 
})(Foo); 
Foo.myPlugin(); //returns test 

這個工作,並離開巴茲可分配。不知道這是不是jQuery如何做。

+0

jQuery puts有些東西Baz.fn = Baz.prototype;在巴茲課堂內。然後,它被實例化後,你可以做Baz.fn.whatever = function()等等...... – farina 2011-04-07 21:25:54

1

從我可以告訴,你永遠不執行該行:在你的Foo()功能

Foo.fn = Foo.prototype; 

函數只在你調用它們時執行

嘗試使用Singleton模式:

var Foo = new function Foo() { 
    this.fn = this.prototype; 
}; 

在這種情況下,你通過調用名爲匿名Foo()功能new運營商創建Foo對象的實例。

+0

如果對象需要構造函數參數,如: var Foo = new function Foo(a,b,c){this.fn = this.prototype; this.doSomething = function(){alert(a);};}; – farina 2011-04-07 20:41:49

+0

參數值如何獲得?它們是否可以在頁面加載? – typeof 2011-04-07 21:32:43

+0

在現有模型中,它們被傳遞給對象的實例。像var Bar = new Foo(a,b,c); – farina 2011-04-08 21:40:34

1

這不是jQuery的問題。正如另一個答案中指出的那樣,代碼中至少有一個問題。

如果您認真理解這一點,John Resig(jQuery的原作者)已經編寫了一個名爲Learning Advanced Javascript的優秀互動教程。

相關問題