Простой пример пространств имен JavaScript, классов и наследования - PullRequest
6 голосов
/ 04 мая 2011

Меня попросили перенести часть нашего PHP-кода в JavaScript, чтобы большая часть нашей логики работала на стороне клиента. Что бы я хотел, это простой пример, который показывает:

  • пространство имен ("Package"), содержащее два класса ("Master" и "Slave")
  • класс "Master" имеет свойство "p", функцию "m" и конструктор, который принимает один аргумент для установки начального значения "p"
  • класс "Slave" наследует оба "p", конструктор и "m" от класса "Master"

Я не против использовать какой-либо существующий фреймворк, но он должен быть легковесным - в идеале не более 200 LOC (без минимизации).

Вот моя попытка, FWIW:

var Package = {};

Package.Master = function(pValue) {
    this.p = pValue;
    this.m = function() {
        alert("mmmmm");
    }
}

Package.Slave = function(pValue) {
    // this will inherit from Package.Master
}

// one of the many online examples:
// http://kevlindev.com/tutorials/javascript/inheritance/index.htm
KevLinDev.extend = function(subClass, baseClass) {
   function inheritance() {}
   inheritance.prototype = baseClass.prototype;

   subClass.prototype = new inheritance();
   subClass.prototype.constructor = subClass;
   subClass.baseConstructor = baseClass;
   subClass.superClass = baseClass.prototype;
}

KevLinDev.extend(Package.Slave, Package.Master);

Ответы [ 4 ]

8 голосов
/ 04 мая 2011

Я фанат Джона Резига Simple Javascript Inheritance .

например:.

var Package = {};
Package.Master = Class.extend({
    init: function(pValue) {
        this.p = pValue;
    },
    m: function() {
        alert("mmmmm");
    }
});

Package.Slave = Package.Master.extend({
    init: function(pValue) {
        this._super(pValue);
    }
});

var slave = new Package.Slave(10);
slave.m();
5 голосов
/ 04 мая 2011

Я думаю, что это один из способов сделать это:

var Package = {};

Package.Master = function(pValue) {
    this.p = pValue;
    this.m = function() {
        alert("mmmmm");
    }
}

Package.Slave = function(pValue) {
    //Call constructor of super class
    Package.Master.call(this, pValue);
}

Package.Slave.prototype = new Package.Master;
2 голосов
/ 04 мая 2011

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

Это примерно так же, как то, что вы опубликовали.

Package = {}
class Package.Master
  constructor: (@p) ->
  m: -> alert 'mmmmm'

class Package.Slave extends Package.Master
  someSlaveMethod: -> foo 'bar'

, который генерирует JS здесь: https://gist.github.com/954177

1 голос
/ 15 июля 2013

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

http://addyosmani.com/blog/essential-js-namespacing/

Он говорит о пяти вариантах и ​​продолжает рекомендовать какиеон чувствует, что лучшие подходы.

Конечно, эта статья приводит к дополнительным информативным и полезным статьям Пространства имен, которые проведут вас по прекрасному путешествию по кроличьей норе Пространства имен!

В любом случае, надеюсь, это поможет.

...