какой шаблон использовать при создании класса javascript?

каков наилучший способ создания классов (как в ООП) в Javascript ? Сейчас я использую следующую схему . Все в порядке ?

var myclass = (function() {
var _name;
var baseObject = {
    a: 10,
    c: function() {
        return _name + " world " + privateFunc();
        }
};
function privateFunc() { return _name + "-ba"; };

function myclass(name) {
    _name = name;
    this.x = 9;
};
myclass.prototype = baseObject;
return myclass; })();

4 ответов


нет "лучшего" пути. В JavaScript есть несколько шаблонов ООП, и тот, который вы упомянули, является одним из них (а также популярным). Это по существу прототипический (или псевдоклассический) шаблон с замыканием для инкапсуляции статических переменных на основе частных классов.

есть и другие шаблоны (например, функциональный шаблон, рекомендованный Дугласом Крокфордом).

Я лично рекомендую псевдо-классический шаблон (хотя какой шаблон лучше всего является горячей областью в прениях).

Если вы делаете ООП с JavaScript, I сильно рекомендуем вам изучить принятие библиотеки JavaScript, которая имеет встроенный ООП, например Инструментарий Dojo или Библиотеки Закрытия. Другие библиотеки (например, jQuery, MOOtools, Ext и т. д.) все имеют модули ООП и / или плагины.


на мой взгляд, лучший способ создать классы в JavaScript - это "не". Простите меня за прямоту, но при работе с JavaScript постарайтесь забыть о классах – их здесь нет – и принять, что язык имеет дело только с объектами.

не имея классов на языке, означает меньше кода для написания. В типичных приложениях большинство объектов не имеют братьев и сестер. У вас будет только один document, одно window, одно userList, etc. Создавать эти объекты использование объектной буквенной нотации:

var userList = {
    users: []
};

хотя в JavaScript нет классов, есть конструкторы и прототипы. Эти понятия пригодятся, когда у вас есть несколько объектов, которые похожи (например, пользователи, содержащиеся в userlist). В примере кода используются оба этих понятия. Используя такие имена, как myclass, трудно сказать, что вы пытаетесь моделировать. Вот пример User конструктор и расширение к нему прототип:

var User = function (name) {
    this.name = name;
};

User.prototype.sayHello = function () {
    return "Hello, my name is " + this.name;
};

следующий пример иллюстрирует шаблон, который я лично разработал в течение долгого времени.

он использует область видимости, чтобы разрешить частные поля и методы.

для детального обсуждения, пожалуйста, взгляните на Шаблоны классов JavaScript

Employee = (function(){

  // private static field
  var staticVar;

  // class function a.k.a. constructor
  function cls()
  {
    // private instance field
    var name = "";
    var self = this;

    // public instance field
    this.age = 10;

    // private instance method
    function increment()
    {
        // must use self instead of this
        self.age ++;
    }

    // public instance method  
    this.getName = function(){
        return cls.capitalize(name);
    };

    this.setName = function(name2){
        name = name2;
    };

    this.increment = function(){
        increment();
    };

    this.getAge = function(){
        return this.age;
    };
  }

  // public static field
  cls.staticVar = 0;

  // public static method
  cls.capitalize = function(name){
      return name.substring(0, 1).toUpperCase() + 
          name.substring(1).toLowerCase();
  };

  // private static method
  function createWithName(name)
  {
    var obj = new cls();
    obj.setName(cls.capitalize(name));
    return obj;
  }

  return cls;
})();

john = new Employee();
john.setName("john");

mary = new Employee();
mary.setName("mary");
mary.increment();

alert("John's name: " + john.getName() + ", age==10: "+john.getAge());
alert("Mary's name: " + mary.getName() + ", age==11: "+mary.getAge());

Javascript использует прототипическое наследование.

Если вы хотите создать пользовательские классы, я бы рекомендовал прочитать, Что такое прототипическое наследование, вместо того, чтобы пытаться заставить методологию c# на js (реализация наследования на основе класса над прототипом)

http://phrogz.net/js/classes/OOPinJS.html