Javascript и Наследование - PullRequest
       5

Javascript и Наследование

4 голосов
/ 05 сентября 2011

Скажем, у меня есть Класс :

function Foo() {
  this.foo1 =  null;
  this.foo2 = function() { return false;};
}

И я хочу, чтобы другие объекты наследовали переменные и функции от него.

function Bar(){}
function Baz(){}

Затем создайте экземпляры моих объектов:

var bar = new Bar();
bar.foo1   // returns null
bar.foo2() // returns false

Какая правильная функция для включает Foo в Bar и Baz?


Я уже сделал Bar.prototype = new Foo();, ноПохоже, что он не работает на нашем любимом IE (<9). </p>

Ответы [ 2 ]

5 голосов
/ 05 сентября 2011

Если вы присоединяете все свойства к прототипу (что предпочтительно, по крайней мере для методов),

function Foo() {}

Foo.prototype.foo1 = null;
Foo.prototype.foo2 = function() { return false;};

, тогда достаточно присвоить прототип родительского элемента прототипу дочернего элемента:

function inherit(Child, Parent) {
    var Tmp = function(){};
    Tmp.prototype = Parent.prototype;
    Child.prototype = new Tmp();
    Child.prototype.constructor = Child;
}

inherit(Bar, Foo);

Здесь мы использовали промежуточную функцию конструктора, чтобы «разъединить» два прототипа.В противном случае, если вы измените один, вы также измените другой (поскольку они ссылаются на один и тот же объект).Этот способ на самом деле довольно популярен и используется парой библиотек.

Если нет, вам нужно вызвать функцию конструктора родителя внутри дочерней функции конструктора:

function Bar() {
    Foo.call(this);
}

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


Дополнительное замечание на вашем пути:

Bar.prototype = new Foo();

this should работает (также в IE на самом деле), но имеет два основных недостатка:

  • Все свойства экземпляра , установленные в Foo, станут свойствами, общими длявсе Bar экземпляров.

  • Что если Foo ожидает некоторые аргументы, доступные только при создании экземпляра Bar?

1 голос
/ 05 сентября 2011

посмотрите на Classy или, если вы любите Ruby и хотите более полное решение для JS.Class . Эти библиотеки помогают вам с ориентацией объекта в JavaScript и скрывают прототип от разработчика.

Надеюсь, это поможет

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