Javascript链式规则,返回特定值而不是[Object对象] [x]
问题在标题上,但首先请看一下这段代码:
function number(a) {
return {
add: function(b) {
result = a + b;
return this;
}, substract(b) {
result = a - b;
return this;
}
}
上面的这些代码是链式法则的简单示例。我重新调整一个对象,以便我可以连续执行:
number(2).add(5).add(3 * 12).substract(Math.random());
我的问题是,我必须重新调整一个对象以保持函数可链接。我想模仿链式法则,但返回特定值。例如 number(2).add(3)
将返回 5。
任何建议都将受到高度赞赏。
提前感谢大家。 [x]
The question is at the title, but first please look at this code:
function number(a) {
return {
add: function(b) {
result = a + b;
return this;
}, substract(b) {
result = a - b;
return this;
}
}
These code above are simple example of chain rule. I retun an object so I can do it continuously:
number(2).add(5).add(3 * 12).substract(Math.random());
My problem is, I have to retun an object to keep the function chainable. I'd like to immitate the chain rule, but to return specific value. For instance number(2).add(3)
would return 5.
Any suggestion is highly appreciated.
Thanks everyone in advanced.
[x]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
使像 5 这样的数值“可链接”的一种方法是在适当的原型对象上定义一个方法,例如
Number.prototype
。例如:上面的语法很有趣,因为
5.add(2)
无效:JavaScript 在5.
之后需要一个数字(或“无”)。由于这是一个全局副作用(它将影响所有数字),因此应注意避免意外的相互作用。唯一的其他使“5”可链接的另一种方法是创建一个新的Number
对象(5 不是真正的 Number 实例,即使它使用 Number.prototype !)然后复制所需的方法。 (我曾经认为这是唯一的其他方法,但是请参阅 KooiInc 的答案 - 然而,我不确定从toString
返回非字符串的定义有多明确。)但是,请记住这引入了微妙的问题:
这就是为什么我们需要一个
Number
(在 JavaScript 中搜索“primitives”):此外,结合 cwolves 的答案,考虑:
然后都是
new number( 2)
以及两者number(2)
将计算出一个新数字对象。快乐编码。
One way to make a numeric value like 5 "chainable" is to define a method on the appropriate prototype object, such as
Number.prototype
. For instance:The syntax above is funny because
5.add(2)
is invalid: JavaScript is expecting a number (or "nothing") after5.
. Because this is a global side-effect (it will affect all numbers), care should be taken to avoid unexpected interactions.The only otherAnother way to make "5" chain-able is to create a newNumber
object (5 is not a real Number instance, even though it uses Number.prototype!) and then copy over required methods. (I used to think this was the only other way, but see KooiInc's answer -- however, I am not sure how well-defined returning a non-string fromtoString
is.)However, keep in mind this introduces subtle issues:
And this is why we need a
Number
(search SO for "primitives" in JavaScript):Furthermore, in conjunction with cwolves' answer, consider:
Then both
new number(2)
and bothnumber(2)
will evaluate to a new number object.Happy coding.
你有两个选择。你可以返回新的对象:
或者你可以修改现有的对象(大部分与上面的代码相同,这是不同的):
不同之处在于它们的行为方式:
You have two options. You can return new objects:
or you can modify the existing one (mostly the same code as above, this is different):
The difference is in how they act:
如果将值定义为属性 (
this.a
) 并在返回的对象中使用toString
,则可以链接这些方法:If you define the value as property (
this.a
) and usetoString
within the returned Object, you can chain the methods: