[英]How do you extend the constructor for a builtin like Object or Number?
假設我想讓所有Numbers在制作之后都具有屬性foo
,例如包含它們的值的兩倍。 我想做
// extend Number constructor here.
console.log(5.foo); // outputs 10
你怎么做呢?
你沒有擴展構造函數,而是擴展原型,通過使用“getter”在其上定義一個新屬性 :
Object.defineProperty(Number.prototype, 'foo', {
get: function() { return this * 2; }
});
> 1.foo
SyntaxError // parser expected decimal part of number after dot
> (1).foo
2
> 1..foo
2
> 1.0.foo
2
> Number(1).foo
2
> new Number(1).foo
2
> 1['foo']
2
> 1e0.foo // exponential notation
2
> parseInt('1px').foo
2
> 0x1.foo // hex
2
> 01.foo // octal, disallowed in strict mode
2
> Math.PI.foo
6.283185307179586
> Infinity.foo
Infinity
> NaN.foo
NaN
為什么第一個例子1.foo
失敗了? JS解析器一旦看到點,就需要一個小數部分。 沒有辦法解決這個問題。 所以你必須滿足於自己說1.0.foo
。
但1.0是原始而不是對象,對吧? 那么, 1.0.foo
怎么可能有效呢? 因為JavaScript會在必要時強制(轉換或轉換)基元到對象。 在這種情況下,數值被強制轉換為數字對象,其長度足以計算foo
的值,之后將丟棄該對象(通過垃圾回收)。
人們可能也想要實現一個setter,就像在
set: function(v) { this = v/2; }
但當然這是無效的; 我們不能this
!! 並且無法訪問Number
對象下面的[[PrimitiveValue]]
來設置它。
我不推薦上述內容,以這種方式擴展內置類型並不是最佳實踐。 這最好放在exotica的領域。
你需要擴展原型:
Number.prototype.foo = function(){
return this*2;
}
這是一種不是會員的方法。 num = 2; num.foo(); //返回4
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.