2012-06-22 92 views
0

使用JavaScript,是否可以使用原型向尚未賦予值的變量添加方法。JavaScript原型爲空變量

例如,我可以這樣做:

var foo = "bar"; 

String.prototype.doTheFoo = function(){ 
    console.log("foo is better then you"); 
}; 

foo.doTheFoo(); 

這給出的所有字符串的方法doTheFoo();

是否有可能如何做同樣的事情,但有些東西還沒有被賦予價值?

var foo; 

(????).prototype.doTheFoo = function()... 

謝謝:)

回答

3

號原型方法去對象構造。默認值var fooundefined,它沒有構造函數。

您可以通過擴展Object.prototype將該方法添加到所有對象。

Object.defineProperty(Object.prototype, 'doTheFoo', { 
    value: function() { alert('foo'); } 
}); 

現在任何具有對象包裝的值都可以使用該方法。

請注意,我使用Object.defineProperty進行了分配。這僅適用於符合ES5的實現。它使屬性不可枚舉,因此它相對安全。


因爲你似乎想這對代替typeof測試的undefined值正常工作,考慮typeof從不需要來測試undefined的事實。

如果這是你被告知的情況,那麼你就被欺騙了。很多人都這樣想,僅僅因爲那是他們一直被告知的。這不是真的。

以下測試是undefined一種絕對安全的測試...

if (foo === undefined) { 

...只要你注意以下...

  1. 決不陰影或用不同的值定義window.undefined

  2. 決不使用違反了#1

  3. 決不嘗試任何代碼來獲得的未申報變量

值來負責維護一個廉潔的環境(一個非常簡單的任務),你就沒有問題了。

0

你能把汽油放在你還沒有的汽車裏嗎?當然不是;你不能附加任何東西。

同樣,您不能將方法附加到空變量;沒有任何東西(因此沒有附加到prototype)。

從技術上講,一個聲明但未分配的變量是undefined,這是一個特殊的原始值類型。基元沒有屬性,所以你不能附加任何方法。

可以添加東西的prototypeObject(從中一切繼承),這樣當你分配一些值給一個變量,它有一個方法,但是這是一個非常,不好主意。

+0

我問的唯一原因是看我是否可以以某種方式創建一個名爲exists()的方法,所以不必如果使用typeof檢查,我只需要'if varname.exists'來檢查是否給定了一個值或null :) – Menztrual

+0

@tehlulz:您不必使用'typeof'檢查。只需檢查默認的'undefined'值。如果你想測試'null'和'undefined',那麼執行'if(varname == null)',測試兩者。 – 2012-06-22 02:57:08

+0

您不能在未定義的標識符上調用方法 - 它是一個「ReferenceError」。試圖這樣做會引發異常,在JS走過原型鏈的階段找到你的方法。不幸的是,你被'typeof'卡住了。 – josh3736