在匿名范围内使用Javascript原型对象

在匿名范围内使用Javascript原型对象,javascript,prototype,Javascript,Prototype,我有两种不同的方式在匿名范围内使用Javascript对象 (function(){ function MyObject() { this.MyMethod = function() { //code here } } first = new MyObject(); first.MyMethod(); })(); 及 我知道原型版本更好,但不确定使用匿名作用域是否会带来不同的优点/缺点。在这种情况下,我

我有两种不同的方式在匿名范围内使用Javascript对象

(function(){

    function MyObject() {
        this.MyMethod = function() {
            //code here
        }
    }

    first = new MyObject();
    first.MyMethod();
})();


我知道原型版本更好,但不确定使用匿名作用域是否会带来不同的优点/缺点。

在这种情况下,我认为它们几乎是等效的。每次执行外部匿名函数时,都将对这两个函数进行解释


因此,只要您在内部只调用一个
newmyobject()
,这并不重要。如果您不止一次地调用它,那么最好使用原型版本

在这种情况下,我认为它们几乎是等价的。每次执行外部匿名函数时,都将对这两个函数进行解释


因此,只要您在内部只调用一个
newmyobject()
,这并不重要。如果您不止一次地调用它,那么最好使用原型版本

我不认为这有什么区别。IIFE(立即调用的函数表达式)是为了防止变量泄漏到全局范围


两个
MyObject
都是构造函数,但第一个构造函数具有作为该实例唯一属性的函数(将在调用
new
时克隆)。在第二个示例中,您向该构造函数的原型添加了一个方法,使其对所有实例都可用,这就是为什么第二个示例更受欢迎。

我认为这没有什么区别。IIFE(立即调用的函数表达式)是为了防止变量泄漏到全局范围


两个
MyObject
都是构造函数,但第一个构造函数具有作为该实例唯一属性的函数(将在调用
new
时克隆)。在第二个示例中,您向该构造函数的原型添加了一个方法,使其可用于所有实例,这就是为什么第二个示例是首选的。在匿名范围中使用没有区别

其好处与在全局范围内使用相同

如果您正在实例化MyObject,那么“原型”版本将避免在每个实例中复制该方法,从而避免浪费资源(内存)


如果实例化MyObject一两次,则立即函数与全局作用域中的一样不会有任何区别。

在匿名作用域中使用不会有任何区别

其好处与在全局范围内使用相同

如果您正在实例化MyObject,那么“原型”版本将避免在每个实例中复制该方法,从而避免浪费资源(内存)


如果要实例化MyObject一两次,则立即函数与全局作用域没有区别。

没有区别。好处仍然是一样的。不过,如果这意味着只创建该构造函数的一个实例,那么只需使用对象文字,这并没有什么区别。好处仍然是一样的。如果这意味着只创建该构造函数的一个实例,那么只需使用对象文字即可。我明白了,因此第一个示例更类似于PHP(每次创建对象都会复制方法)。我猜如果原型有一个构造器,同样的事情也会发生。。。不,不是这样的。使用“prototype”意味着对象的每个实例将共享相同的方法,即通过引用访问。所以这更像PHP。如果没有“原型”,每个实例都将有自己的方法副本。-但是,比较JavaScript到PHP(或类似C语言的C++语言或java语言的高级语言)可能会导致错误的结论或糟糕的编程模式,因为JavaScript是一种无类和功能语言。我建议学习一点JS基础知识……我写这篇文章是因为我过去犯过同样的错误!我认为它看起来像C,让我们把它当作是C,有一些小的区别。不,坏主意。这完全是另一回事!我明白了,所以第一个例子更类似于PHP(每次创建对象都会复制方法)。我猜如果原型有一个构造器,同样的事情也会发生。。。不,不是这样的。使用“prototype”意味着对象的每个实例将共享相同的方法,即通过引用访问。所以这更像PHP。如果没有“原型”,每个实例都将有自己的方法副本。-但是,比较JavaScript到PHP(或类似C语言的C++语言或java语言的高级语言)可能会导致错误的结论或糟糕的编程模式,因为JavaScript是一种无类和功能语言。我建议学习一点JS基础知识……我写这篇文章是因为我过去犯过同样的错误!我认为它看起来像C,让我们把它当作是C,有一些小的区别。不,坏主意。这完全是另一回事!
(function(){

    function MyObject(){}; 

    MyObject.prototype.MyMethod = function() {
        //code here
    }

    first = new MyObject();
    first.MyMethod();
})();