Javascript-прототип наследования создает дополнительные свойства в производных классах - PullRequest
3 голосов
/ 09 июля 2011

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

Допустим, я начинаю с этой типичной функции наследования:

Function.prototype.inheritsFrom = function( parentClassOrObject ){
if ( parentClassOrObject.constructor == Function ) { 
    this.prototype = new parentClassOrObject;  //Normal Inheritance 
    this.prototype.constructor = this;
    this.prototype.parent = parentClassOrObject.prototype;
} else { 
    this.prototype = parentClassOrObject;      //Pure Virtual Inheritance 
    this.prototype.constructor = this;
    this.prototype.parent = parentClassOrObject;
} 
return this;
};

Вы, наверное, видели это раньше. Теперь я создаю следующее наследование:

function base() {
    this.id = 0;
};

base.prototype.init = function ( _id ){
    this.id = _id;
};

function entity(){
};

entity.inheritsFrom( base );

entity.prototype.init = function( _id ){
    this.parent.init.call( this, _id );
};

Теперь мы используем класс сущности следующим образом:

var e = new entity();
e.init( "Mickey" );
console.log( e.id );

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

e: entity
  id: "Mickey"
  __proto__: base
    constructor: function entity(){
    id: 0
    init: function ( _id ){
    parent: base
    __proto__: base

Почему у меня два идентификатора? Производный класс даже не ссылается на this.id базового класса.

1 Ответ

3 голосов
/ 09 июля 2011

В inheritsFrom, когда вы делаете new parentClassOrObject, вызывается базовый конструктор, а свойство id устанавливается на прототип. Вам нужно изменить свой метод:

Function.prototype.inheritsFrom = function( parentClassOrObject ){
  if ( parentClassOrObject.constructor == Function ) {
    function tmp() {}
    tmp.prototype = parentClassOrObject;
    this.prototype = new tmp;  //Normal Inheritance 
    this.prototype.constructor = this;
    this.prototype.parent = parentClassOrObject.prototype;
  } else { 
    this.prototype = parentClassOrObject;      //Pure Virtual Inheritance 
    this.prototype.constructor = this;
    this.prototype.parent = parentClassOrObject;
  } 
  return this;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...