2

我看到 JavaScript 中的对象最常以以下两种方式组织。有人可以解释一下两者之间的区别和好处吗?是否存在一种更适合另一种的情况?

非常感谢任何澄清。非常感谢!

第一的:

   var SomeObject;

    SomeObject = (function() {

     function SomeObject() {}

         SomeObject.prototype.doSomething: function() {

         },
         SomeObject.prototype.doSomethingElse: function() {

         }

    })();

第二:

SomeObject = function() {

 SomeObject.prototype.doSomething: function() {

 },
 SomeObject.prototype.doSomethingElse: function() {

 }

}
4

3 回答 3

5

这两个例子都不正确。我想你的意思是:

第一的:

var SomeObject;
SomeObject = (function() {

    function SomeObject() {
    }

    SomeObject.prototype.doSomething = function() {
    };

    SomeObject.prototype.doSomethingElse = function() {
    };

    return SomeObject;

})();

(注意匿名函数末尾的 return,使用=而不是:,以及完成函数分配的分号。)

或者你的意思可能是:

function SomeObject() {
}

SomeObject.prototype.doSomething = function() {
};

SomeObject.prototype.doSomethingElse = function() {
};

(没有匿名封闭函数。)

第二:

function SomeObject() {
}
SomeObject.prototype = {

    doSomething: function() {
    },
    doSomethingElse: function() {
    }
};

(请注意,原型的赋值是在函数之外SomeObject;在这里,我们使用:是因为我们在对象初始化器中。同样,我们;在末尾有完成赋值语句。)

如果我是正确的,它们之间几乎没有区别。它们都创建了一个SomeObject构造函数并将匿名函数添加到其原型中。第二个版本用一个全新的对象(我不推荐)替换了构造函数的原型,其中第一个只是扩充了构造函数已经拥有的原型。SomeObjectSomeObject

一个更有用的形式是:

var SomeObject;
SomeObject = (function() {

    function SomeObject() {
    }

    SomeObject.prototype.doSomething = doSomething;
    function doSomething() {

    }

    SomeObject.prototype.doSomethingElse = doSomethingElse;
    function doSomethingElse()
    }

    return SomeObject;

})();

在那里,我们分配给函数doSomethingdoSomethingElse具有名称,这在您在调试器中遍历代码时很有用(它们显示在调用堆栈、断点列表等中)。包装所有内容的匿名函数在那里,因此doSomethinganddoSomethingElse名称不会污染封闭的命名空间。更多:匿名者匿名

我们中的一些人更进一步:

var SomeObject;
SomeObject = (function() {
    var p = SomeObject.prototype;

    function SomeObject() {
    }

    p.doSomething = SomeObject$doSomething;
    function SomeObject$doSomething() {

    }

    p.doSomethingElse = SomeObject$doSomethingElse;
    function SomeObject$doSomethingElse()
    }

    return SomeObject;

})();

...这样我们不仅可以看到doSomething,而且可以SomeObject$doSomething在列表中看到 。有时这可能会妨碍您,但这是一种风格选择。(另请注意,我使用匿名函数为 加上别名SomeObject.prototype,以减少输入。)

于 2012-04-19T14:34:05.727 回答
0

首先,这两个片段都不会为我解析(Chrome) - 你应该使用=. :也就是说,我的拙见如下。

后面的代码片段有点奇怪,因为您实际上SomeObject是在对象构造时在 的原型上定义方法,而不是在解析时。因此,如果您在 上重新定义了某些方法SomeObject.prototype,则一旦构造了新对象,它将恢复为原始版本。这可能会导致此类型的现有对象出现意外行为。

前一个看起来不错,除了(function { ...} ())()包装器可能不是必需的。您可以只声明:

function SomeObject() {}
SomeObject.prototype.doSomething = function() {}
SomeObject.prototype.doSomethingElse = function() {}
于 2012-04-19T14:32:40.780 回答
0

您的问题中第一个和第二个之间的实际区别只是:

var o = (function () {})();  # call this (A)

var o = function () {};  # call this (B)

不幸的是,您提供的示例都没有正确编写,虽然我认为任何一个都不会在解析时实际给出错误,但当您尝试对结果进行处理时,两者都会以有趣的方式中断。

为了给你一个关于(A)和(B)之间区别的答案,(A)是立即函数应用模式。JavaScript Patterns book 有一个很好的讨论,我推荐。

在我写这篇文章时,其他人已经解释了你代码中的实际问题。TJ Crowder 特别指出了重要的事情。

于 2012-04-19T14:36:40.743 回答