对象的链式调用
问题
你想调用一个对象上的多个方法,但不想每次都引用该对象。
解决方案
在每次链式调用后返回 this(即@)对象
class CoffeeCupconstructor: ->@properties=strength: 'medium'cream: falsesugar: falsestrength: (newStrength) ->@properties.strength = newStrengththiscream: (newCream) ->@properties.cream = newCreamthissugar: (newSugar) ->@properties.sugar = newSugarthismorningCup = new CoffeeCup()morningCup.properties # => { strength: 'medium', cream: false, sugar: false }eveningCup = new CoffeeCup().strength('dark').cream(true).sugar(true)eveningCup.properties # => { strength: 'dark', cream: true, sugar: true }
讨论
jQuery 库使用类似的手段从每一个相似的方法中返回选择符对象,并在后续方法中通过调整选择的范围修改该对象:
$('p').filter('.topic').first()
对我们自己对象而言,一点点元编程就可以自动设置这个过程并明确声明返回 this 的意图。
addChainedAttributeAccessor = (obj, propertyAttr, attr) ->obj[attr] = (newValues...) ->if newValues.length == 0obj[propertyAttr][attr]elseobj[propertyAttr][attr] = newValues[0]objclass TeaCupconstructor: ->@properties=size: 'medium'type: 'black'sugar: falsecream: falseaddChainedAttributeAccessor(this, 'properties', attr) for attr of @propertiesearlgrey = new TeaCup().size('small').type('Earl Grey').sugar('false')earlgrey.properties # => { size: 'small', type: 'Earl Grey', sugar: false }earlgrey.sugar trueearlgrey.sugar() # => true
转载本站内容时,请务必注明来自W3xue,违者必究。


优化或报错有奖
皖公网安备34020702000426号