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

标签:CoffeeScript

相关阅读 >>

CoffeeScript 检测与构建丢失的函数

CoffeeScript 由数组创建一个字符串

CoffeeScript 递归函数

CoffeeScript 指数对数运算

CoffeeScript 将数组连接

CoffeeScript mongodb

CoffeeScript 使用数组来交换变量

CoffeeScript 计算两个日期中间的天数

CoffeeScript 创建一个不存在的对象字面值

CoffeeScript 替换子字符串

更多相关阅读请进入《CoffeeScript》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...