0

我有一些这样的代码:

function Foo( arr, prop ) {
  this.arr = arr;
  this.isOn = prop;
}

function newFoo( arr, prop ) {
  return new Foo( arr, prop );
}

Foo.prototype = {

  a: function() {
    var result = [];
    // do something and push to result
    if ( this.prop ) // do something different with result
    return newFoo( result );
  },

  // This is the method that determines if prop = true in the chain
  b: function() {
    result = [];
    // do something and push to result
    // this time 'prop' must be 'true'
    return newFoo( result, true )
  }

};

如果链true中的前一个元素有prop. 显然,上述方法不起作用,如您在此处看到的:

var nf = newFoo;
console.log( nf( [1,2,3] ).b().isOn ); //=> true
console.log( nf( [1,2,3] ).b().a().isOn ); //=> undefined

我知道我可以newFoo( result, this.prop )在每种方法上一直返回,但我很想知道是否有任何其他解决方案可以解决这个问题。随着方法数量的增加,随着时间的推移,将很难跟踪此属性。

4

3 回答 3

2

随着方法数量的增加,随着时间的推移,将很难跟踪此属性。

您可以创建一个额外的方法,该方法具有newFoo自动跟踪您不会覆盖的属性的功能:

function Foo( arr, prop ) {
  this.arr = arr;
  this.isOn = prop;
}

Foo.prototype = {

  clone: function newFoo( arr, prop ) {
    return new Foo(
      arguments.length >= 1 ? arr : this.arr,
      arguments.length >= 2 ? prop : this.isOn
    );
  },

  a: function() {
    var result = [];
    // do something and push to result
    if ( this.prop ) // do something different with result
    return this.clone( result );
  },

  // This is the method that determines if prop = true in the chain
  b: function() {
    result = [];
    // do something and push to result
    // this time 'prop' must be 'true'
    return this.clone( result, true )
  }

};

我在arguments.length这里用来检查是否传递了参数,您也可以针对始终真实的属性进行测试undefined或使用简单。arr || this.arr

于 2013-01-18T08:24:34.920 回答
0

将“a”函数更改为

a: function() {
    var result = [];
    // do something and push to result
    if ( this.prop ){} // so something different with result
    return newFoo( result );
  },
于 2013-01-18T08:10:24.793 回答
0
function Foo( arr, prop ) {
    this.arr = arr;
    this.isOn = prop || false; // if prop is undefined, set false
}

这应该可以解决您的问题。

如果你不添加prop参数,isOn将被设置undefined。这就是为什么你得到undefined输出。

于 2013-01-18T08:11:44.133 回答