2013-08-29 2 views
0

Можете ли вы, пожалуйста, порекомендовать, какое из следующих является лучшим или их плюсами и минусами? Я не уверен, но, может быть, это зависит от типа использования? Является ли один тяжелее другого с точки зрения производительности (сохраняя класс в памяти и т. Д.)?Лучший способ использования Prototype [OOP]

Заранее благодарен!

Метод 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; 
})(); 
+0

Нет никакой разницы в том, как вы используете прототип. Образцовый шаблон модуля («метод 2») не нужен в вашем случае, но, вероятно, не будет ничего плохого. – Bergi

ответ

3

Есть два основных отличия:

  1. В первом методе, вы заменяете прототип по умолчанию с n совершенно новый объект. Это нормально, но экземпляры 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; 
    })(); 
    

Это различия. Оба в конечном итоге делают то же самое: создайте конструктор с некоторыми свойствами/методами, прикрепленными к прототипу. Нет никакой разницы в терминах «оптимизации».

+0

Спасибо за ваш ответ, но лучше, чем другой, создать «оптимизированные» классы или они «просто разные» в синтаксической форме? Спасибо заранее. – athom

+0

Я обновил свой код (добавлено два метода), чтобы быть более точным. – athom

+0

@Antho Хорошо, я обновил свой ответ на основе вашего обновления и комментариев. – bfavaretto

Смежные вопросы