如何扩展像Object或Number这样的内建函数的构造函数
How do you extend the constructor for a builtin like Object or Number?
假设我想让所有数字在生成后都具有属性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]]
来设置它
我不推荐以上内容,以这种方式扩展内置类型并不是最佳实践。这是最好放在异国情调的领域。
您需要扩展原型:
Number.prototype.foo = function(){
return this*2;
}
这是一种方法,而不是成员。num=2;num.foo()//返回4
相关文章:
- setTimeout可以与闭包内的函数一起使用吗
- jQuery dosn'内联函数不能按预期工作
- 对象内的函数
- 在Javascript中的内联函数中将参数作为值传递
- 无需Javascript内置函数即可将十进制转换为十六进制
- 从函数向内置函数中添加多个参数
- 如何使用jsoup检测内联js函数?我基本上想检查内联函数是否存在
- jQuery.remove()不起作用,而其他内置函数则起作用
- 包括js文件和使用jquery就绪范围内的函数
- Prototype.js 1.7:将collect与显式函数一起使用会返回与内联函数不同的结果,原因是什么
- 如何将动态生成的变量传递给 JavaScript 函数的 innerHTML 内的函数
- JavaScript ES6:测试箭头函数、内置函数、常规函数
- 全局范围内的函数表达式与函数声明的区别
- JavaScript:动态调用对象内的函数
- 如何在 angularjs 指令中的链接函数内访问函数中的范围
- 如何查找函数是内置函数还是用户定义的函数
- 从角度工厂内调用函数
- WordPress内置函数无法在ajax php文件上识别
- 在 JavaScript 中将数组作为内置函数参数传递
- 如何扩展像Object或Number这样的内建函数的构造函数