0

您能否推荐以下哪些是最好的或它们的优缺点?我不确定,但也许,这取决于使用类型?一个在性能方面比另一个重(将课程保存在内存中等)?

提前致谢!

方法一

var MyClass = function(something) {
    this.something = something;
}
MyClass.prototype = {
    myMethod: function(arg) {
        this.arg = arg;
        return this.arg;
    },
    mySecondMethod: function() {
            return "helloWorld";
    }
}

方法二

var MyClass = (function () {

    function MyClass(something) {
        this.something = something;
    }
    MyClass.prototype.myMethod = function (arg) {
        this.arg = arg;
        return this.arg;
    };
    MyClass.prototype.mySecondMethod = function (arg) {
            return "helloWorld";
    }

    return MyClass;
})();
4

1 回答 1

3

有两个主要区别:

  1. 在第一种方法中,您将用一个全新的对象替换默认原型。没关系,但是 MyClass 的实例将继承错误的constructor属性。您可以通过以下方式解决此问题:

    MyClass.prototype = {
        constructor: MyClass
        myMethod: // etc...
    

    或者简单地扩展默认原型:

    var MyClass = function(something) {
        this.something = something;
    }
    MyClass.prototype.myMethod = function(arg) {
        this.arg = arg;
        return this.arg;
    }
    
  2. 在第二种方法中,您将整个事物包装在一个立即调用的函数中。如果您想拥有“私有”(实际上是类似私有的)变量,这很有用,因为在内部声明的变量将对内部声明的函数可见,但不会泄漏到外部范围:

    var MyClass = (function () {
        var privateVar = "something"; // this will be visible by the functions
                                      // below but not outside
    
        function MyClass(something) {
            this.something = something;
        }
    
        MyClass.prototype.myMethod = function (arg) {
            this.arg = arg;
            return this.arg;
        };
    
        // You were missing this
        return MyClass;
     })();
    

这些是差异。两者最终都做同样的事情:创建一个构造函数,将一些属性/方法附加到原型。在“优化”方面没有区别。

于 2013-08-29T14:43:45.927 回答