【问题标题】:Is this bad practice: getMyObject().method()这是不好的做法吗:getMyObject().method()
【发布时间】:2013-05-02 20:33:41
【问题描述】:

假设我有一个返回对象的函数:

getMyObject(){
   //do stuff here
   return object;
}

在函数名本身上调用方法(不返回任何内容)是不好的做法:

getMyObject().method();

而不是将变量分配给返回对象,然后在该变量上调用方法:

var returnedObject = getMyObject();
returnedObject.method();

我正在处理一个包含许多嵌套框架的 html 页面,并且我可以访问一个返回这些框架之一的函数。该框架可能在我的脚本中的其他函数中多次使用,我想知道是否可以按照上述方式访问该框架,或者声明一个全局变量是否更好。

*编辑:* 啊,我还没有机会使用 jQuery。很高兴知道!

【问题讨论】:

  • 我看不出有什么问题。它就像带有链接函数的 jQuery,例如.add(object).hide().show().
  • 作为一般规则,如果您知道自己为什么这样做并且可以证明自己的推理合理,我会说这不是一个坏习惯。话虽如此,您可能希望避免在不需要的地方引入复杂性。如果您选择使用全局变量,我建议您创建一个全局对象来存储所有“共享”变量。当我使用 jQuery 时,我通常会在 jQuery 本身上添加一个命名空间并将共享变量存储在该对象中。例如:jQuery.myApp = {}。权衡是较慢的变量访问与全局污染。

标签: javascript


【解决方案1】:

是的,这完全没问题。例如 jQuery 也使用它。它返回可以立即调用方法的对象。这称为链接。

【讨论】:

    【解决方案2】:

    在您的示例中,方法链是更好的做法恕我直言。如果一个函数返回一个对象,您想在该对象上调用一个方法,但在调用该方法后不需要引用该对象,则不要将其分配给变量。

    此外,jQuery 代码总是这样做(1):

    $('#foo').on('click',function(){});
        /\      \\
        ||       \\  
        ||        \\
    function call returns jQ object <============|
                      \\                        ||
                       \\call method "on" upon _||
    

    (1)澄清一下:我并没有声称所有 jQ 方法都返回一个对象 .attr().prop() 不要。我说的“一直”其实是OP描述的场景非常在jQ代码中很常见(函数调用,返回对象的调用方法): p>

    var someString = $($('.foo').get(0)).attr('id');//tricky little bugger, this :)
    var aBool = $('#foo').prop('checked');
    

    【讨论】:

    • jQuery 并非一直这样做。他们为 setter 和其他一些地方这样做。也许这对我们来说很明显,但对每个人来说都不是。例如,当您使用 .prop("checked") 之类的东西时,它会返回一个布尔值,而不是选定的元素。
    • @Ian:您不只是调用$.prop('checked'),而是在一个jQ 对象上调用它,该对象通常通过传递字符串(查询选择器)或DOM 引用(主要是this)来创建到主jQ函数:$('#foo')是一个函数调用,返回jQ对象,所以$('#foo').prop('checked')和op做的完全一样:getMyObject().method()
    • 我从来没有说过你像$.prop("checked") 这样称呼它——我的意思是不是所有 jQuery 方法都返回jQuery 对象,所以你不应该声称它。例如$("#element_id").attr("data-id", 1).show()就可以了,可以继续缓存,当你在末尾添加.prop("checked")之类的东西,它就不会继续链接jQuery对象了。
    • 否则,我认为您的陈述“如果一个函数返回一个对象,您想在该对象上调用一个方法,但在调用该方法后不需要引用该对象,请不要分配它到一个变量。”是正确的,是需要考虑的重要事项。
    • 严重没问题!同样,知道你的意思。我只是想确保您了解我来自哪里,并向您展示可能的困惑。感谢更新,我认为这是一个很好的描述:)
    【解决方案3】:

    通常,不会。像这样链接方法调用通常更简单、更优雅且更易于阅读。但是,在某些情况下,最好使用变量。

    1. 如果您多次使用一个方法(或方法链),如果它使代码更简洁,您可以使用变量。
    2. 如果方法处理时间较长,最好缓存结果。例如,如果您有一些名为calculateResults() 的方法,并且它从数据库中提取数据,则需要一些时间。如果数据没有改变,那么每次调用该方法都会产生该成本。最好将其存储在变量中并重复使用。
    3. 如果方法有副作用,你应该小心不要多次调用它。每次调用时都会造成这些副作用。同样,作为一个例子,如果你有一个像nextItem() 这样的函数,它前进到下一个项目并返回它(a la Java 迭代器),那么调用它超出预期实际上会改变结果。在这种情况下,您别无选择,只能存储结果,因为多次调用它会产生错误的行为。

    否则,锁链!

    【讨论】:

    • 您能详细解释一下第 2 点和第 3 点吗?顺便说一句,我不同意第 1 点,因为如果你使你的方法名称有意义,它有助于更​​容易地阅读代码(正如你已经说过的)。
    • @Zim84 完成,希望会更好。
    • @JakeKing Point 2 不是有效的 IMO。没有什么可以阻止某人在链方法中进行缓存并检查该缓存而不是执行一些昂贵的操作。
    • @FeistyMango 确实如此,但它没有缓存的可能性相同。当然,如果您知道它会被缓存,那没关系,但如果您不这样做......此外,您可以知道很多操作不会自动缓存。它甚至可以是你自己写的东西。在那种情况下,这一点仍然非常重要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多