【问题标题】:Function vs. Object Literal Notaion - is there a diifference?Function vs. Object Literal Notation - 有区别吗?
【发布时间】:2012-04-09 20:38:28
【问题描述】:

这两种方式都使用相同的调用机制。

显然,我想使用最好的方式,但也许只是偏好问题?

就风格而言,我喜欢 Object Literal Notation,因为它提供了封闭性。

函数符号:

var TextProcessor = function()
{
};
TextProcessor.unEscape = function( second_split )
{
    var element;
    for( element in second_split )
    {
        second_split[element] = second_split[element].replace( '**', '*', 'g' );
        second_split[element] = second_split[element].replace( '|*', '|', 'g' );
    }
    return second_split;
};
TextProcessor.pullBullet = function( text )
{
    var pattern = /<(.+)_([a-z]){1}>$/;
    return pattern.exec( text );
};
TextProcessor.pullDomain = function( text )
{
    return text.match( /:\/\/(www\.)?(.[^\/:]+)/ )[2];
};

对象文字符号

/**
 *TextProcessor
 */

var TextProcessor = 
{
    unEscape:    function( text )
    {
        var index;
        for( index in second_split )
        {
            text[index] = text[index].replace( '**', '*', 'g' );
            text[index] = text[index].replace( '|*', '|', 'g' );
        }
        return second_split;
    },
    pullBullet:  function( text )
    {
        var pattern = /<(.+)_([a-z]){1}>$/;
        return pattern.exec( text );
    },
    pullDomain:  function( text )
    {
        return text.match( /:\/\/(www\.)?(.[^\/:]+)/ )[2];
    }
}

【问题讨论】:

  • 一些关于如何使用这些对象的附加信息会很有帮助。是否只会创建其中一个对象,循环中的多个对象等?
  • 您想知道哪种方法最适合创建类吗?还是想解决这种特殊情况?
  • 我想要一个好的类(对象)层次结构......
  • 我希望比我更聪明的人也能为此演示揭示模块模式。
  • 我想我会用这个 - stackoverflow.com/questions/1595611/…

标签: javascript


【解决方案1】:

你在做两件有些不同的事情。

  • 第一个示例创建一个函数对象并为其分配属性。

  • 第二个示例使用这些属性创建一个普通对象。

在您的示例中,第一个确实没有多大实际意义。您可以使用函数对象来分配属性,但您为什么要这样做呢?这些属性对函数的调用没有影响。


“就风格而言,我喜欢 Object Literal Notation,因为它提供了封闭性。”

我不知道“外壳”是什么。这听起来像是封装和闭包的结合,而对象字面量两者都没有。


回到第一部分,想象一下如果你创建了这些对象中的任何一个......

var TextProcessor = new Number();
var TextProcessor = new Boolean();
var TextProcessor = new Date();

...然后将属性分配给它。它会起作用,但它会是一件奇怪的事情。对象是NumberBooleanDate 这一事实与手头的任务几乎没有关系。

当您将属性分配给 Function 对象时,这实际上就是您正在做的事情。

【讨论】:

  • 第一个可以用new创建对象,第二个不能。
  • @Rocket:但是对于添加到函数对象的属性,使用函数作为构造函数没有影响。如果该函数打算用作构造函数来创建具有这些属性的对象,则需要将这些属性分配给函数体内的this
  • 我认为他所说的“封闭”并不是要谈论任何技术概念,只是所有代码都“封闭”在{} 中,而不是一堆单独的语句。不过可能是错的。
  • 我实际上倾向于第一种方式......一旦我弄清楚如何实现继承......所以我可以将正则表达式抽象为一个由 this 和我拥有的其他使用正则表达式的对象....第一个示例将是朝这个方向迈出的中间步骤..因为我还不知道如何实现继承....有点离题了。
  • @GuyMontag:请注意,您在第一个示例中的操作方式不会影响使用该函数创建的对象,无论是直接还是通过继承。
猜你喜欢
  • 2016-06-18
  • 1970-01-01
  • 2018-02-28
  • 2022-08-11
  • 2020-09-02
  • 1970-01-01
  • 2014-09-20
相关资源
最近更新 更多