使用Prototype [OOP]的最佳方式

时间:2013-08-29 14:41:44

标签: javascript performance oop optimization prototype

您能否请您推荐以下哪种方式最佳或优缺点? 我不确定,但也许,这取决于使用的类型? 在性能方面比一个更重(将类保持在内存等)?

提前致谢!

方法1

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

方法2

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;
})();

1 个答案:

答案 0 :(得分: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;
     })();
    
  3. 这些是差异。两者最终都做同样的事情:创建一个构造函数,其中一些属性/方法附加到原型。 “优化”方面没有区别。