簡體   English   中英

你如何擴展像Object或Number這樣的內置構造函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM