Как объявить родительский и дочерний класс в JavaScript? - PullRequest
2 голосов
/ 09 июля 2011

Единственное, что мне не нравится в javascript, это то, что есть сотни способов сделать что-то.Что я хочу знать, как я могу объявить класс?Использую ли я функцию ()?Должен ли я вызвать Class.create ()?Что такое «стандартная практика»?Что такое «стандартная практика» для объявления функций-членов?Я использую прототип?Я использую myClass.method ()?И, наконец, как мне сделать базовое наследование родителей и детей?Причина, по которой я спрашиваю, заключается в том, что в Интернете я получил много способов сделать это.Я хочу знать, что такое «стандартная практика».

Ответы [ 3 ]

1 голос
/ 09 июля 2011

Причина, по которой не существует «стандартной практики» для объявления классов и особенно подклассов в Javascript, заключается в том, что Javascript на самом деле не имеет встроенной поддержки синтаксического языка для типичных классов, которые можно найти в C ++. Вместо этого у него есть своя собственная хитрость для того, как генерировать похожую функциональность, и есть много разных способов выразить эти уловки. Там действительно нет стандартного пути.

Я считаю, что лучше всего использовать одну из наиболее распространенных библиотек javascript (jQuery, Prototype, YUI, Closure и т. Д.), А затем использовать предоставляемые ими функции для подклассов, которые дадут вам собственный «стандарт». способ сделать это. Если вы не хотите использовать одну из библиотек, им нужно будет позаимствовать некоторый код для подклассов (эквивалент функции YUI extended ()) и затем решить, какой стиль вы хотите использовать.

Лично я считаю, что это слабость Javascript в более крупных проектах, проектах с несколькими людьми, работающими над ними, или проектах, которые должны быть расширены другими, в которых отсутствует синтаксис языка для «способа» объявления классов и подклассов. Вместо этого, единственный способ иметь согласованную кодовую базу - это решить самостоятельно, какой стиль декларации вы собираетесь использовать, а затем применять его в качестве стандарта кодирования в проекте, так же, как и в случае со скобочным стилем или отступом. стиль.

1 голос
/ 09 июля 2011

Определенно согласен с другими постерами в том, что нет «стандартной практики» для того, что вы описываете.Я поделюсь тем, что я использую сейчас, что похоже на то, что Дуглас Кроуфорд использует в своей книге Хорошие части .Я не утверждаю, что он идеален, но я долго расстраивался из-за этого вопроса, и он работал хорошо для меня, когда я хочу организовать JS-код в режиме ООП.

var ParentClass = function () {
  var my = {},  // store private member variables and functions
    that = {};  // store public member variables and functions
  my.privateVar = 0;
  that.publicVar = 7;

  // this won't be visible outside of parent class,
  // even to children unfortunately
  my.getPrivateVar = function () {
    return my.privateVar;
  };

  my.privateFunction = function () {
    // do stuff
  };

  // this will be visible to children classes and anyone
  // else using ParentClass
  that.parentFunction = function () {
    // here we can access private vars and functions
    my.privateVar++;
    my.privateFunction();
  };

  // and here we return the object that we created
  // to store the public member variables and functions
  return that;
};

var ChildClass = function () {
  var my = {}, // more private vars and functions will live here
    that = ParentClass();  // and here we subclass ParentClass;

  // here define more public, private methods as before
  that.childFunction = function () {
  };

  return that;
};

// test drive it
var cc = ChildClass();
cc.parentFunction();
cc.childFunction();
console.debug(cc.publicVar);
// console.debug(cc.privateVar);  // undefined
1 голос
/ 09 июля 2011

Я рекомендую вам прочитать Шаблоны JavaScript от Стояна Стефанова. Он подробно освещает эту тему.

Лично мне скорее нравится Шаблон модуля . Это уменьшает глобальное загрязнение космоса и прост в использовании.

Edit:

Другие ответы опускают ключевое слово new при создании экземпляров своих "классов". Пожалуйста, смотрите ответ 383503 для подробного обсуждения создания экземпляров JavaScript "классов" должным образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...