Идея наследования JavaScript? - PullRequest
1 голос
/ 31 июля 2010

РЕДАКТИРОВАТЬ : Я отправил, прежде чем я все продумал.Вот лучшая реализация того, что было у меня на уме: Идея наследования Javascript (часть 2)

Хорошо, так что я видел, что следующее плохо

function A() {
    this.variable = 7;
    this.method = function() { alert(this.variable); };
}

alpha = new A();
beta = new A();

потому что вы дублируете метод для каждого экземпляра.Однако, почему вы не можете это сделать:

var A = new function() {
    this.variable = null;
    this.method = function() { alert(this.variable); };
};

var alpha = {variable: 8};
alpha.__proto__ = A;

var beta = {variable: 9};
beta.__proto__ = A;

Затем вы наследуете методы, не тратя впустую память, и можете указать новые переменные экземпляра.

Конечно, я никогда не видел этогошаблон, так какова очевидная причина, по которой он не используется?

Ответы [ 3 ]

2 голосов
/ 31 июля 2010

Я думаю, что вы ищете чистое прототип наследования .

В стандарте ECMAScript 5-го издания представлен метод Object.create, этот метод создает объект, который напрямуюнаследуется от первого переданного аргумента (который может быть либо null, либо объектом).

Например:

var A = {
  variable: null,
  method : function () { alert(this.variable); };
};

var alpha = Object.create(A);
alpha.variable = 8; // or above `Object.create(A, {'variable': { value: 8 } });`

var beta = Object.create(A);
beta.variable = 9;

Этот метод доступен в самых последних браузерах , однако можно грубо эмулировать в реализации ECMAScript 3:

if (!Object.create) {
  Object.create = function (o) {
    if (arguments.length > 1) { throw Error('Second argument not supported'); }
    if (o === null) { throw Error('Cannot set a null [[Prototype]]'); }
    if (typeof o != 'object') { throw TypeError('Argument must be an object'); }
    function F(){}
    F.prototype = o;
    return new F;
  };
}

Обратите внимание, что есть некоторые функции, которые нельзя эмулировать в ES3, например, второй аргумент, он ожидает дескриптор свойства, такой как используемый дескрипторс помощью нового метода Object.defineProperties.

Кроме того, Object.create позволяет создавать объект, который не наследуется ни от какого другого объекта, устанавливая для его [[Prototype]] значение * 1026.*

2 голосов
/ 31 июля 2010

Очевидная причина, по которой он не используется, заключается в том, что вы создаете объекты самостоятельно, а не позволяете конструктору создавать их.Если конструктор позже будет изменен, чтобы работать иначе, ваш код может сломаться.

Лучшим решением будет

function A(value) {
    this.variable = value;
}

A.prototype.method = function() { alert(this.variable); };

Javascript уже просматривает методы объекта, а затем методы прототипа объекта,выяснить, что позвонить.Поэтому определение вашего метода в прототипе А определяет его для каждого А, который вы создадите или даже уже создали.

0 голосов
/ 31 июля 2010

Основная причина того, что шаблон не используется, заключается в том, что __proto__ не является стандартным. Работает с Firefox / Chrome. Но не работает с IE.

Кроме того, предложенный вами код не имеет конструктора. Предполагается, что вы инициализируете объект с правильной структурой.

...