Один из способов сделать числовое значение, например 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
(ищите SO для «примитивов» в JavaScript):
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
Удачного кодирования.