Добавление прототипа в объектный литерал

У меня есть некоторый объект, скажем, son ​​, который я хотел бы наследовать от другого объекта папа .

Конечно, я могу сделать функцию конструктора для папы, как

Father = function() {
  this.firstProperty = someValue;
  this.secondProperty = someOtherValue;
}

, а затем использовать

var son = new Father();
son.thirdProperty = yetAnotherValue;

, но это не совсем то, что я хочу. Так как у сына будет много свойств, было бы более читабельным, чтобы сын был объявлен как литерал объекта. Но тогда я не знаю, как установить его прототип.

Выполнение чего-то подобного

var father = {
  firstProperty: someValue;
  secondProperty: someOtherValue;
};
var son = {
  thirdProperty: yetAnotherValue
};
son.constructor.prototype = father;

не будет работать, поскольку цепочка прототипов, кажется, скрыта и не заботится об изменении constructor.prototype.

Я думаю, что могу использовать свойство __ proto __ в Firefox, как и

var father = {
  firstProperty: someValue;
  secondProperty: someOtherValue;
};
var son = {
  thirdProperty: yetAnotherValue
  __proto__: father
};
son.constructor.prototype = father;

, но, насколько я понимаю, это не стандартная функция языка, и лучше не использовать ее напрямую.

Есть ли способ указать прототип для литерала объекта?

7
задан Tom van der Woerdt 28 December 2011 в 15:53
поделиться

2 ответа

Вы правы, __ proto __ - нестандартное свойство, и это единственные два стандартных способа установить [[Prototype]] нового объекта , это:

  • С помощью конструктора и оператора new (как вы уже упомянули).
  • Использование метода ECMAScript 5 Object.create .

Object.create еще не широко поддерживается (работает в IE9Pre3 +, Firefox 3.7Alpha +, Chrome 5+ Safari 5+, Rhino 1.7), но в какой-то момент все реализации будут соответствовать ES5 spec.

Он может принимать два аргумента: первый - это объект, который будет использоваться в качестве [[Prototype]] нового объекта, а второй - это еще один объект, собственные свойства которого могут быть описанным (в той же структуре, что и Object.defineProperties ).

Например:

var father = {
  firstProperty: 1,
  secondProperty: 2
};

var son = Object.create(father, {
  thirdProperty: {
    value: 'foo'
  }
});

father.isPrototypeOf(son); // true
son.firstProperty; // 1

Внутреннее свойство сына [[Prototype]] будет относиться к отцу , и оно будет содержать свойство значения с именем третье свойство .

11
ответ дан 6 December 2019 в 19:31
поделиться

Указание прототипа для литерала объекта немного «неудобно», поскольку вам в первую очередь понадобится прототип для объектов, которые вы создаете с помощью синтаксиса конструктора (например, new X ()). Не говорю, что это невозможно ... но это странно. Аналогичный шаблон, который хорошо зарекомендовал себя (например, используется jQuery), состоит в том, чтобы вместо этого определить прототип как литерал объекта. Например:

var X = function() {};
X.prototype = {
  protoFunc1: function() {},
  protoFunc2: function() {}
};
-1
ответ дан 6 December 2019 в 19:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: