javascript - Javascript链规则,返回特定值而不是 [Object object] [x ]

  显示原文与译文双语对照的内容
0 0

问题是在标题,但首先请看下面的代码:

function number(a) {
 return {
 add: function(b) {
 result = a + b;
 return this;
 }, substract(b) {
 result = a - b;
 return this;
 }
}

这些代码 上面 是链规则的简单示例。 我retun一个对象,这样我可以连续地完成它:

number(2).add(5).add(3 * 12).substract(Math.random());

我的问题是,要想保持功能链的功能,我必须。 我想immitate的链规则,但返回特定的值。 例如 number(2).add(3) 将返回 5.

任何建议都非常感激。

感谢高级 [x ] 中的所有人

时间:原作者:3个回答

0 0

使数值类似于 5的一种方法是,在适当的Prototype对象( 如 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不是实数实例,即使它使用数字 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中)的原因:

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

开心编码。

原作者:
0 0

有两个选项可以返回新对象:

function number(a){
 return this instanceof number? (this.value = a, this) : new number(a);
}
number.prototype = {
 valueOf : function(){
 return this.value;
 },
 add : function(b){
 return new number(this.val + b);
 },
 subtract : function(b){
 return new number(this.val - b);
 }
};

或者,你可以修改现有的( 大多数是与 上面 相同的代码,这是不同的):

add : function(b){
 this.value += b;
 return this;
},

区别在于它们的行为方式:

var x = new number(5),
 y = x.add(10);
//with first example
//x == 5, y == 15
//with 2nd example
//x == 15, y == 15, x === y
原作者:
0 0

如果将值定义为属性( this.a ),并在返回对象中使用 toString,则可以链接方法:

function number(a) {
 return {
 a: Number(a) || 0,//if not a, or a===NaN, default = 0
 add: function(b) {
 this.a += b;
 return this;
 },
 subtract: function(b){
 this.a -= b;
 return this;
 },
 valueOf: function(){
 return Number(this.a);
 },
 toString: this.valueOf
 }
}
var n = number(5);
alert(number.add(5).add(2).subtract(2));//=> 10
alert(number.add(0.5));//=> 10.5
alert(number(2).add(5).add(3 * 12).subtract(Math.random());
//=> 42.36072297706966
原作者:
...