2016-09-04 41 views
0

我想添加一個能夠處理所有對象的方法。最好它不應該存在於基元(數字,布爾,字符串,符號)上,它不能工作。繼承方法除了基元以外的所有對象

這是可能的,如果是這樣,如何?

使用Object.prototype不起作用,因爲基元類型從Object繼承。

+0

定義「工作」。你的意思是出現在JS中每個對象的原型中的函數? –

+0

@AsadSaeeduddin添加一個屬性,該屬性在基元上不起作用。 –

+1

我的意思是Object.prototype.test = 1; true.test == 1 –

回答

3

您可以設置的Object原型的功能,然後設置相應的部件上,你不希望它undefined構造函數的原型:

Object.prototype.foo = function() { alert("foo"); }; 
Number.prototype.foo = undefined; 
var x = {}; 
var y = 10; 
x.foo(); // works 
y.foo(); // TypeError: y.foo is not a function 

我不知道你爲什麼'這樣做,它看起來像一個代碼氣味,但你去。

1

基元不是對象,不會從任何地方繼承。它們可以包裹在繼承自Object.prototype的對象中,但這些對象是對象。

它可能看起來像基元繼承屬性,但在引擎蓋下可以訪問對象包裝器,而不是基元。當GetValue可解決一個特性引用,

因此,如果參考的基礎是一個原始的,它會試圖獲取屬性之前被轉換爲一個對象。

但作爲@nnnnnn筆記,當你call the methodthis值將是原始的,因爲引用的基礎沒有改變。注意在草率模式下它將被強制轉換爲對象。

事實上,你可以利用這一點,並測試是否this價值is an object,如果你想要的是防止原語被用作調用方法時引用的基地:中

Object.prototype.method = function() { 
    "use strict"; 
    if(Object(this) !== this) { 
    throw Error('This method can only be called on objects'); 
    } 
    // ... 
    return "works"; 
}; 
true.method(); // Error: This method can only be called on objects 
new Boolean(true).method(); // "works" 
+1

我明白你所做的區別,但是......甚至你自己的例子'true.self()'表明你可以使用一個原語並直接從Object.prototype中調用該方法。 (我直接說「在代碼中你沒有明確地轉換或包裝任何東西,它只是」起作用「)。另外,想想如果你在你的函數中加上'」use strict「;會發生什麼? .. – nnnnnn

0

精簡的方式從基元中移除該方法。

Object.prototype.test = function() { } 

for(let { prototype } of [ String, Number, Boolean, Symbol ]) { 
prototype.test = undefined 
} 
相關問題