Наследование JavaScript с работающим помощником и контурами? - PullRequest
1 голос
/ 25 декабря 2010

Я знаю множество разных подходов к наследованию JavaScript. Я думаю, что одним из наиболее важных факторов является то, работает ли помощник по кодам и структура с моделью наследования.

Например, в ExtJS наследование включает в себя:

MyApp.SuperWindow = Ext.extend(Ext.Window, {
    constructor: function() {
        this.doSomething();
        MyApp.SuperWindow.superclass.constructor.apply(this, arguments);
    },

    doSomething: function() {
    }
});

Наше SuperWindow расширяет оконный компонент Ext дополнительными функциональными возможностями. Хотя это наследование работает, вы теряете помощника по коду и схему всех IDE, которые я знаю (Eclipse, Netbeans, Aptana, NuSphere и др.).

Однако вы можете сделать что-то вроде:

MyApp.SuperWindow = {
    constructor: function() {
        this.doSomething();
        MyApp.SuperWindow.superclass.constructor.apply(this, arguments);
    },

    doSomething: function() {
    }
});

MyApp.SuperWindow = Ext.extend(Ext.Window, MyApp.SuperWindow);

Но это выглядит просто ужасно. Вам нужно набрать MyApp.SuperWindow трижды (не включая вызов родительского конструктора, который вы можете написать с помощью this).

Как бы вы пошли по поводу наследования в JavaScript, сохраняя при этом помощников и контуров кода?

Я хотел бы сохранить концепцию родителя / супер с моделью наследования. Поскольку типичное наследование включает размещение копии объекта только в своем прототипе, у вас нет таких вещей, как supers.

1 Ответ

1 голос
/ 25 декабря 2010

Я большой поклонник простого наследования Джона Резига , которое достаточно чисто по синтаксису, например:

var Person = Class.extend({
  init: function(forename, surname)
  {
    this.Forename = forename;
    this.Surname = surname;
  }
});

var Employee = Person.extend({
  init: function(forename, surname, role)
  {
    this._super(forename, surname);
    this.Role = role;
  }
});

var employee = new Employee("Matthew", "Abbott", "Developer");
console.log(employee.Forename + " " + employee.Surname + " is a " + employee.Role);

console.log(employee instanceof Class);
console.log(employee instanceof Person);
console.log(employee instanceof Employee);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...