gpt4 book ai didi

javascript - 你如何扩展像 Object 或 Number 这样的内置函数的构造函数?

转载 作者:行者123 更新时间:2023-11-30 12:35:32 25 4
gpt4 key购买 nike

假设我想让所有数字在创建后都具有属性 foo,例如包含其值的两倍之类的东西。我愿意做

// extend Number constructor here.
console.log(5.foo); // outputs 10

你是怎么做到的?

最佳答案

您不扩展构造函数,而是扩展原型(prototype),由 defining a new property在上面,有一个“ setter/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]] 来设置它。

我不推荐以上方法,以这种方式扩展内置类型不被认为是最佳实践。这最好放在异国情调的领域。

关于javascript - 你如何扩展像 Object 或 Number 这样的内置函数的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26187332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com