У меня есть некоторый объект, скажем, 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;
, но, насколько я понимаю, это не стандартная функция языка, и лучше не использовать ее напрямую.
Есть ли способ указать прототип для литерала объекта?
Вы правы, __ proto __
- нестандартное свойство, и это единственные два стандартных способа установить [[Prototype]] нового объекта
, это:
new
(как вы уже упомянули). 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]]
будет относиться к отцу
, и оно будет содержать свойство значения с именем третье свойство
.
Указание прототипа для литерала объекта немного «неудобно», поскольку вам в первую очередь понадобится прототип для объектов, которые вы создаете с помощью синтаксиса конструктора (например, new X ()). Не говорю, что это невозможно ... но это странно. Аналогичный шаблон, который хорошо зарекомендовал себя (например, используется jQuery), состоит в том, чтобы вместо этого определить прототип как литерал объекта. Например:
var X = function() {};
X.prototype = {
protoFunc1: function() {},
protoFunc2: function() {}
};