Шаблон наследования Javascript. Обратная связь, пожалуйста?

Мне просто интересно, есть ли какие-либо недостатки в том, как я справляюсь с наследованием ниже? Есть ли какие-либо утечки памяти, требующие большего использования памяти, чем другие шаблоны наследования? Я предпочитаю кодировать JavaScript с помощью шаблона "class" ниже ( new ...()) ... Я считаю, что другие шаблоны наследования навязчивы, и только что придумали этот...

Комментарии приветствуются!

// Class A
function A() {

  var that = this;

  that.hello = function() {

    return "HELLO";

  }

}

// Class B
function B() {
  var zuper = new A();
  var that = this;

  that.variable = "VARIABLE";

  zuper.bye = function () {

    return "BYE";
  }

  zuper.getVariable = function() { 
    return that.variable
  }

  return zuper;
}

var b = new B();
alert ( b.hello() ) // "HELLO"
alert ( b.bye() )   // "BYE"
alert ( b.getVariable() ) // "VARIABLE"

================================ РЕДАКТИРОВАТЬ ================= ================ Я пересмотрел свой оригинальный способ и придумал это. Страдает ли это от той же проблемы, что и предыдущая (Два объекта, созданные при создании B, (всего A и B)) См. Команду apply в начале B

// Class A
function A() {

  var that = this;
  that.publicProperty = "PUBLIC_PROPERTY";
  var privateProperty = "PRIVATE_PROPERTY";

  that.hello = function() {
    return "HELLO";
  }

  that.getPrivateProperty = function () {
     return privateProperty;
  }

  that.overrideThis = function() {
    return "NO_PLEASE_NO";
  }

}

// Class B
function B(a, b, c) {
  A.apply(this, arguments);

  this.variable = "VARIABLE";
  var privateVariable = "PRIVATE_VARIABLE";

  this.bye = function () {

    return "BYE";
  }

  this.getVariable = function() { 
    return this.variable
  }

  this.getPrivateVariable = function() { 
    return privateVariable;
  }

  this.getAandB = function() {
    return a + b;
  }

  this.getFromSuperPublicPropery = function() {
    return this.publicProperty;
  }

  this.overrideThis = function() {
    return "MUHAHAHA";
  }

}

var b = new B("aaa", "bbb");

alert ( b.hello() )        // "HELLO"
alert ( b.bye() )          // "BYE"
alert ( b.getVariable() )  // "VARIABLE"
alert ( b.getPrivateVariable() ) // "VARIABLE"'
alert ( b.getAandB() )           // "aaabbb"
alert ( b.getFromSuperPublicPropery() )  // "PUBLIC_PROPERTY"
alert ( b.getPrivateProperty() ) // "PRIVATE_PROPERTY"  
alert ( b.overrideThis() ) // MUAHAHAA  


function C() {
  A.apply(this, arguments);
}

var c = new C();
alert ( c.overrideThis() ) // "NO_PLEASE_NO"
alert ( c.bye() ) // Expecting an exception here! Correct!    

3 ответа

Я думаю, вы должны подумать о прототипах в JavaScript. Смотрите эту статью - http://www.sitepoint.com/javascript-inheritance/.

Я бы предложил использовать следующий шаблон (в вашем примере):

// A function to implement basic inheritance
function inherit(child, parent) {
  function F() {};
  F.prototype = parent.prototype;
  child.prototype = new F();
  // Reassign the original constructor, explained below
  child.prototype.constructor = child;
  // Maybe have a reference to parent prototype
  // child.superClass = parent.prototype;
}

// Class A
function A() {
}

A.prototype.hello = function() {
    return "HELLO";
}

// Class B
function B() {
    this.variable = "VARIABLE";    
}

inherit(B, A);

B.prototype.bye = function() {
    return "BYE";
}

B.prototype.getVariable = function() {
    return this.variable;
};


var b = new B();
alert ( b.hello() ) // "HELLO"
alert ( b.bye() )   // "BYE"
alert ( b.getVariable() ) // "VARIABLE"

//If you reassigned the original constructor to child, you can do the following
alert (b instanceof B); //true
alert (b instanceof A); //true

Вы также можете переопределить hello, как B.prototype.hello если бы вы хотели, и это не отразилось бы на родительских (объект A) экземплярах. Таким образом, вы на самом деле используете прототипы, чтобы сохранить дубликаты определений функций и фактически наследовать свойства, функции и т. Д.

Как HungryMind объяснил, что у вас есть не наследование, это больше похоже на делегирование. instanceof не будет работать для тестирования, если это базовый класс. Если вместо этого вы предпочитаете создавать объекты на основе замыканий (для частных переменных), вы застряли в схеме наследования, в которой не используется прототип.

Смотрите мой пост о том, что делает для правильного наследования в JS. http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html Не то, чтобы вы не могли использовать любую другую схему, но вы не должны, пока не поймете, как наследование предназначено для работа в JS.

Другие вопросы по тегам