CoffeeScript 对象的链式调用

对象的链式调用

问题

你想调用一个对象上的多个方法,但不想每次都引用该对象。

解决方案

在每次链式调用后返回this(即@)对象

class CoffeeCup
    constructor:  ->
        @properties=
            strength: medium
            cream: false
            sugar: false
    strength: (newStrength) ->
        @properties.strength = newStrength
        this
    cream: (newCream) ->
        @properties.cream = newCream
        this
    sugar: (newSugar) ->
        @properties.sugar = newSugar
        this

morningCup = 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 == 0
            obj[propertyAttr][attr]
        else
            obj[propertyAttr][attr] = newValues[0]
            obj

class TeaCup
    constructor:  ->
        @properties=
            size: medium
            type: black
            sugar: false
            cream: false
        addChainedAttributeAccessor(this, properties, attr) for attr of @properties

earlgrey = new TeaCup().size(small).type(Earl Grey).sugar(false)

earlgrey.properties # => { size: small, type: Earl Grey, sugar: false }

earlgrey.sugar true

earlgrey.sugar() # => true

作者:冒牌SEO,如若转载,请注明出处:https://www.web176.com/coffeescript/10697.html

(0)
打赏 支付宝 支付宝 微信 微信
冒牌SEO冒牌SEO
上一篇 2023年2月26日
下一篇 2023年2月26日

相关推荐

发表回复

登录后才能评论