我想添加一個能夠處理所有對象的方法。最好它不應該存在於基元(數字,布爾,字符串,符號)上,它不能工作。繼承方法除了基元以外的所有對象
這是可能的,如果是這樣,如何?
使用Object.prototype不起作用,因爲基元類型從Object繼承。
我想添加一個能夠處理所有對象的方法。最好它不應該存在於基元(數字,布爾,字符串,符號)上,它不能工作。繼承方法除了基元以外的所有對象
這是可能的,如果是這樣,如何?
使用Object.prototype不起作用,因爲基元類型從Object繼承。
您可以設置的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
我不知道你爲什麼'這樣做,它看起來像一個代碼氣味,但你去。
基元不是對象,不會從任何地方繼承。它們可以包裹在繼承自Object.prototype
的對象中,但這些對象是對象。
它可能看起來像基元繼承屬性,但在引擎蓋下可以訪問對象包裝器,而不是基元。當GetValue可解決一個特性引用,
- 如果HasPrimitiveBase(V)爲真,則
- 返回基。[[獲取]](GetReferencedName(V),GetThisValue(V))。
因此,如果參考的基礎是一個原始的,它會試圖獲取屬性之前被轉換爲一個對象。
但作爲@nnnnnn筆記,當你call the method,this
值將是原始的,因爲引用的基礎沒有改變。注意在草率模式下它將被強制轉換爲對象。
事實上,你可以利用這一點,並測試是否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"
我明白你所做的區別,但是......甚至你自己的例子'true.self()'表明你可以使用一個原語並直接從Object.prototype中調用該方法。 (我直接說「在代碼中你沒有明確地轉換或包裝任何東西,它只是」起作用「)。另外,想想如果你在你的函數中加上'」use strict「;會發生什麼? .. – nnnnnn
精簡的方式從基元中移除該方法。
Object.prototype.test = function() { }
for(let { prototype } of [ String, Number, Boolean, Symbol ]) {
prototype.test = undefined
}
定義「工作」。你的意思是出現在JS中每個對象的原型中的函數? –
@AsadSaeeduddin添加一個屬性,該屬性在基元上不起作用。 –
我的意思是Object.prototype.test = 1; true.test == 1 –