使像 5 这样的数值“可链接”的一种方法是在适当的原型对象上定义一个方法,例如Number.prototype
. 例如:
Number.prototype.add = function (n) {
return this + n
}
(5).add(2) // 7
5.0.add(2) // 7
5..add(2) // 7
((5).add(2) + 1).add(34) // okay! 42
上面的语法很有趣,因为5.add(2)
它是无效的:JavaScript 在5.
. 因为这是一个全局副作用(它将影响所有数字),所以应注意避免意外的交互。
唯一的另一个使“5”可链接的另一种方法是创建一个新Number
对象(5 不是真正的 Number 实例,即使它使用 Number.prototype!)然后复制所需的方法。(我曾经认为这是唯一的另一种方式,但请参阅 KooiInc 的回答——但是,我不确定返回非字符串的定义有多明确toString
。)
function ops(a) {
return {
add: function(b) {
var res = new Number(a + b) // important!
var op = ops(res)
res.add = op.add // copy over singletons
return res
}
}
}
function number(a) {
return ops(a)
}
number(5).add(2) + 1 // 8
(number(5).add(2) + 1).add(34) // error! add is not a function
但是,请记住,这会带来一些微妙的问题:
typeof 5 // number
typeof new Number(5) // object
5 instanceof Number // false
new Number(5) instanceof Number // true
这就是为什么我们需要一个Number
(在 JavaScript 中搜索“primitives”):
x = 5
x.foo = "bar"
x.foo // undefined
此外,结合 cwolves 的回答,请考虑:
function number (n) {
if (this === window) { // or perhaps !(this instanceof number)
return new number(n)
} else {
this.value = n
}
}
然后两者new number(2)
都number(2)
将评估为一个新的数字对象。
number(2).value // 2
new number(2).value // 2
number(2) instanceof number // true
new number(2) instanceof number // true
快乐编码。