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

Как я могу эмулировать классы (и пространства имен) в JavaScript?

Мне нужно создать библиотеку JavaScript и иметь ограниченный опыт работы с языком. Я всегда думал, что он имеет встроенную поддержку классов, но он менее связан с Java, чем я предполагал. Кажется, что все в JavaScript на самом деле является функцией.

То, что я обнаружил до сих пор, имеет большой смысл, поскольку это динамический слабо типизированный язык, но это делает его немного удачным для людей, которые привыкли иметь строго типизированный язык и использовать компилятор для выявления наших ошибок: )

Я в основном работаю в C # и Java, и надеялся на что-то похожее по синтаксису, чтобы библиотека выглядела знакомой для других наших разработчиков на C #, которым придется ее поддерживать.

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

Я понимаю, что мне нужно что-то похожее на C # или Java, когда я должен просто принять тот факт, что это JavaScript , но моя цель - попытаться облегчить процесс обучения для других разработчиков, сделав его более привычным и интуитивно понятным для них.

//Perform the namespace setup (this will actually be done with checking 
//in real life so we don't overwrite definitions, but this is kept short 
//for the code sample).
var DoctaJonez = new function();
DoctaJonez.Namespace1 = new function();

/**
 * Class description.
 */
DoctaJonez.Namespace1.SomeClass = function()
{
    /**
     * Public functions listed at the top to act like a "header".
     */
    this.publicFunction = privateFunction;

    /**
     * Private variables next.
     */
    var privateVariable;

    /**
     * Finally private functions.
     */
    function privateFunction()
    {

    }
}

//Create an instance of the class
var myClass = new DoctaJonez.SomeClass();

//Do some stuff with the instance
myClass.publicFunction();
10.12.2008 12:06:39
7 ОТВЕТОВ

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

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

1
3.08.2013 06:43:08

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

1
10.12.2008 12:29:17
Я не знал, что ты мог бы сделать это, это выглядит намного элегантнее. Спасибо за вклад :) +1
Doctor Jones 10.12.2008 14:10:29

Для общего понимания ООП в 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.

Примеси:

// 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!");
  }
});

Смешанное множественное наследование:

// 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: прямое одиночное наследование, множественное наследование на основе миксина, автоматическое построение цепочек конструкторов и супер-беспроблемные методы.

10
6.08.2013 05:14:27
0
3.08.2013 06:55:07

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

1
3.08.2013 06:56:36

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

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

2
3.08.2013 06:59:05
Это звучит очень интересно. Я буду исследовать это дальше, спасибо за ссылку :)
Doctor Jones 11.12.2008 09:12:13