这些模式有何不同?

6

这是如何实现的:

var obj = obj || {};

obj.Something = (function() {

    function Something() {

    };

    Something.prototype.someMethod = function() {

    };

    return Something;

})();

与此不同的是:
obj.Something = function() {

};

obj.Something.prototype = {

};

这些模式有何不同? 什么情况下我应该使用其中之一?


8
向你的老师坚持要一个恰当的答案。 - Bart Kiers
4
如果你的问题是“这两种方法有什么区别和缺点”,那么我认为这是一个合适的问题;但是现在的措辞实际上要求我们去猜测你的老师的意思,而这是我们无法做到的。请重新用其他措辞提出问题的标题。 - David Thomas
@DavidThomas,你当然不能猜测,但我知道老师并不总是知道他们所说的一切,除非他所说的是可靠的,否则我不想传播他所说的话。 - user2251919
1
@user2251919:在我看来,目前这个问题并不是很有建设性。它的表述方式是让你做一件事情,但你不同意。如果你还在学习阶段,应该假设教你的人有他们的理由。然而,好奇心是伟大的,如果你有一个真正的问题,想知道两种方法之间的区别,那么问题应该集中在这个方面,而不是像“谁是对的?”这样的问题,因为“正确”的答案可能取决于我们不知道的情况。 - Nope
1
@FrançoisWahl,这是一个好奇的问题,不是争论性的问题,只是表述方式有误! - user2251919
显示剩余7条评论
3个回答

8

使用老师推荐的方法的主要原因是你可以定义其他变量和函数,这些内容不会暴露在全局作用域中。

例如:

obj.Something = (function() {
    var sum = 0;
    function Something() {
    };
    Something.increment = function(){ sum++ };
    Something.getSum = function(){ return sum };    
    return Something;
})();

这里的sum不是公共的,也不会污染全局命名空间。
除此之外,这两种模式非常相似。但最好熟悉IIFE模式,尤其是当您像您一样尝试了解它的用途而不仅仅是应用它时。

而相反的,局部变量不能被其他代码触及。此外,您可以使用(例如)function($, window, undefined) {})(jQuery, window)来“锁定”某些全局变量或值,以使它们保持不受干扰。 - ErikE
2
@alex23 如果在与外部代码相同的级别上声明 var sum = 0,那么它就是一个全局变量。这是非常基础的东西。 - ErikE
1
@alex23 那么它就不是很私密了,对吧?obj.sum 仍然可以被篡改。 - ErikE
2
另外,第一种方法可以轻松地在一个步骤中重命名类,而不必在代码中搜索每个obj.Something的实例。 - zzzzBov
1
@zzzzBov 我以前用查找和替换作为快捷方式,结果把一些本来不应该改变的东西搞砸了! - user2251919
显示剩余10条评论

1

我认为他更倾向于面向对象的编程方式。他的语法类似于一个类定义,这可能会使它更加“可用”,根据他的话。


1
在他的例子中,他几乎做了一个闭包。你应该了解一下这个。如果在自调用函数的上下文中有任何变量,那么你就会有一个闭包。
另外,请注意,在你老师的例子中,某些东西在其原型上有一个函数。在你的例子中,你通过用空的原型替换它来擦除了Something的原型。

1
计算机科学中的闭包(Closure),是指一个函数可以访问其自由变量,即使在该函数在定义时这些变量的作用域已经不存在了。这个概念与编程语言无关。 - StoicJester
@Susanoh13 确实是这样。谢谢,我忘了提到这一点。 - Geeky Guy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接