2013-01-18 60 views
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。 Obvisouly上面的方法是行不通的,你可以在這裏看到:

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)所有的時間在每一個方法,但我很好奇,看看是否有解決這個問題的任何其他解決方案。隨着方法數量的增長,隨着時間的推移很難追蹤這個屬性。

回答

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進行始終如一的屬性。

+0

哦,看起來不錯,讓我試試... – elclanrs

+0

工作完美!我必須在整個代碼中更改'newFoo'的上下文,並添加相當多的'var self = this'來保持上下文正確,但它似乎工作正常。 – elclanrs

0

改變 '一個' 功能

a: function() { 
    var result = []; 
    // do something and push to result 
    if (this.prop){} // so something different with result 
    return newFoo(result); 
    }, 
0
function Foo(arr, prop) { 
    this.arr = arr; 
    this.isOn = prop || false; // if prop is undefined, set false 
} 

這應該弄清楚你的問題。

如果您不添加prop參數,isOn將設置爲undefined。這就是爲什麼你得到undefined作爲輸出。

+0

我想你誤解了這個問題。我意識到這一點,加上'undefined'是虛構的......我想要的是保持傳遞'prop'而不必將舊值傳遞到每個新實例,如果這是可能的/也許是一種不同的方法? – elclanrs