gpt4 book ai didi

coffeescript - 在类构造函数中解构参数列表-Coffeescript

转载 作者:行者123 更新时间:2023-12-03 13:22:13 27 4
gpt4 key购买 nike

如果我有一个类,则将多个参数传递给:

class Foo

constructor: (parameters) ->

@bar = parameters.bar
@moo = parameters.moo


该类的创建如下:

foo = new Foo(bar: 2, moo: 8)


我的问题是,在构造函数中检测传递的变量是否存在以及是否不设置默认值的最优雅方法是什么。我将在javascript中执行的方式是:

this.bar = ( parameters.bar !== undefined ) ? parameters.bar : 10;


其中默认值为10。

谢谢你的帮助 :)

好的答案-总结最好的方法:

为了检测参数是否存在并定义默认值(如果不存在),在javascript中是:

this.bar = ( parameters.bar !== undefined ) ? parameters.bar : 10;


并且在文字中是:

@bar = parameters.bar ? 10


如此优雅小巧!

最佳答案

您可以使用existential operator

class Foo
constructor: (options = {}) ->
@bar = options.bar ? 10
@moo = options.moo ? 20


该构造函数编译为:

// Compiled JS.
function Foo(options) {
var _ref, _ref1;
if (options == null) {
options = {};
}
this.bar = (_ref = options.bar) != null ? _ref : 10;
this.moo = (_ref1 = options.moo) != null ? _ref1 : 20;
}


等效的替代方法是立即销毁options对象(因此避免为其使用不必要的名称),然后在未传递这些选项的情况下设置默认值:

class Foo
constructor: ({@bar, @moo} = {}) ->
@bar ?= 10
@moo ?= 20


由于带有选项的对象传递是JS代码中的常见模式,因此某些库具有有用的实用程序功能可以对此提供帮助。例如,下划线提供了 _.defaults,我认为这会产生易于阅读的代码:

class Foo
constructor: ({@bar, @moo} = {}) ->
_.defaults @, bar: 10, moo: 20


如果您不使用Underscore,那么还会有 $.extend(谁仍然不使用jQuery?):

class Foo
defaults = bar: 10, moo: 20
constructor: (options = {}) ->
{@bar, @moo} = $.extend {}, defaults, options


如果您相信将要传递的唯一选项是有效选项,则可以直接使用 extend对象,这比其他选项要少得多。

class Foo
defaults = bar: 10, moo: 20
constructor: (options = {}) ->
$.extend @, defaults, options


最后一种选择是在 Foo中具有默认值,并且只有将它们包含在options参数中时,才将它们设置为自己的属性:

class Foo
bar: 10
moo: 20
constructor: ({bar, moo} = {}) ->
@bar = bar if bar?
@moo = moo if moo?


这样可以防止 Foo.prototype的所有实例具有各自的单独属性,而是在它们使用默认值时在实例之间共享相同的属性,这通常与方法相同。您也可以执行 Foo仅在参数值与默认值不同时分配这些属性。

如您所见,有很多方法可以做到这一点。它们都不是完美的,它们都有优点和缺点,因此请尝试选择更适合您的需求/品味/无论什么的D

关于coffeescript - 在类构造函数中解构参数列表-Coffeescript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11493163/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com