Как я могу эмулировать “классы” в JavaScript? (с или без сторонней библиотеки) [закрытый]

21
задан 8 revs, 2 users 67% 3 August 2013 в 06:41
поделиться

7 ответов

Для общего понимания ООП в JavaScript Вы не можете добиться большего успеха, чем чтение Douglas Crockford :

Для вентиляторов Dojo (и для общих методов) у Neil Roberts есть хорошие статьи:

dojo.delegate JavaScript Метакласса dojo.declare () является, вероятно, самой усовершенствованной основой ООП в основных библиотеках вокруг. Я смещаюсь, но не делаю честное слово. Вот примеры того, как использовать его.

простой простой объект А:

// Let's define a super simple class (doesn't inherit anything).
dojo.declare("Person", null, {
  // Class-level property
  answer: 42,

  // Class-level object property
  name: {first: "Ford", last: "Prefect"},

  // The constructor, duh!
  constructor: function(age){
    this.age = age; // instance-level property
  },

  // A method
  saySomething: function(verb){
    console.log("I " + verb + " " +
      this.name.first + " " + this.name.last + "!" +
      " -- " + this.answer);
  },

  // Another method
  passportControl: function(){
    console.log("I am " + this.age);
  }
});

Пример использования:

// A fan of Ford Perfect
var fan = new Person(18);
fan.saySomething("love"); // I love Ford Perfect! -- 42
fan.passportControl();    // I am 18

Единичное наследование легко:

// Let's create a derived class inheriting Person
dojo.declare("SuperAgent", Person, {
  // Redefine class-level property
  answer: "shaken, not stirred",

  // Redefine class-level object property
  name: {first: "James", last: "Bond"},

  // The constructor
  constructor: function(age, drink){
    // We don't need to call the super class because
    // it would be done automatically for us passing
    // all arguments to it.

    // At this point "age" is already assigned.

    this.drink = drink; // Instance-level property
  },

  // Let's redefine the method
  saySomething: function(verb){
    // Let's call the super class first
    this.inherited(arguments);
    // Pay attention: no need for extra parameters, or any extra code,
    // we don't even name the class we call --- it is all automatic.
    // We can call it any time in the body of redefined method

    console.log("Yeah, baby!");
  },

  shoot: function(){ console.log("BAM!!!"); }
});

Пример использования:

// Let's create a James Bond-wannabe
var jb007 = new SuperAgent(45, "Martini");
jb007.saySomething("dig");  // I dig James Bond! -- shaken, not stirred
                            // Yeah, baby!
jb007.passportControl();    // I am 45
jb007.shoot();              // BAM!!!

// Constructors were called in this order: Person, SuperAgent
// saySomething() came from SuperAgent, which called Person
// passportControl() came from Person
// shoot() came from SuperAgent.

Mixins:

// Let's define one more super simple class
dojo.define("SharpShooter", null, {
  // For simplicity no constructor

  // One method to clash with SuperAgent
  shoot: function(){
    console.log("It's jammed! Shoot!");
  }
});

находящееся в Mixin множественное наследование:

// Multiple inheritance
dojo.declare("FakeAgent", ["SuperAgent", "SharpShooter"], {
  // Let's do it with no constructor

  // Redefine the method
  saySomething: function(verb){
    // We don't call super here --- a complete redefinition

    console.log("What is " + verb "? I want my " + this.drink + "!");
  },
});

Пример использования:

// A fake agent coming up
var ap = new FakeAgent(40, "Kool-Aid");
ap.saySomething("hate"); // What is hate? I want my Kool-Aid!
ap.passportControl();    // I am 40
ap.shoot();              // It's jammed! Shoot!

// Constructors were called in this order: Person, SuperAgent
// saySomething() came from FakeAgent
// passportControl() came from Person
// shoot() came from SharpShooter.

, Как Вы видите, dojo.declare(), дает все предметы первой необходимости с простым для использования API: прямое единичное наследование, находящееся в mixin множественное наследование, автоматическое объединение в цепочку конструкторов и вышестоящие методы без стычек.

10
ответ дан 29 November 2019 в 21:24
поделиться

Если Вы (и Ваша команда) привыкли к Java, но потребность сделать некоторый JavaScript для веб-сайта, возможно, необходимо рассмотреть Google  Web  Инструментарий (GWT). Это позволяет Вам кодировать JavaScript с помощью Java, который преобразовывается в JavaScript. Я не попробовал его, все же.

JavaScript является на самом деле довольно прохладным языком. Это имеет несколько дефектов (включая разрешение Вам сделать очень глупый материал), но с немного сам дисциплина можно сделать большой материал. JavaScript на самом деле объект - ориентирован, не так класс - ориентированный, но можно сделать большую часть того же материала. У Вас нет наследования (AFAIK), но это не строго вообще (одна из его мощных, но также и опасных функций) с вводом, таким образом, Вы найдете, что это не ограничивает.

2
ответ дан 29 November 2019 в 21:24
поделиться

mepcotterell предоставляет хорошие ссылки, но я хотел бы добавить, что я лично предпочитаю рассматривать пространства имен как объекты т.е. DoctaJonez.Namespace1 = {};.

1
ответ дан 29 November 2019 в 21:24
поделиться

Например, в http://mckoss.com/jscript/object.htm .

Вы найдете набор примеров при гуглении для "объектно-ориентированного JavaScript". Путем взгляда на популярные платформы JavaScript как Ext  JS Вы получите чувство для этих понятий и как они применяются на практике.

1
ответ дан 29 November 2019 в 21:24
поделиться

Использование MooTools. См. статью , Как записать Класс .

Mootools
1
ответ дан 29 November 2019 в 21:24
поделиться

Посмотрите статья (MDC) Mozilla Developer Network , Основанная на классах по сравнению с Основанными на прототипе Языками .

0
ответ дан 29 November 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: