Вы не можете этого сделать, потому что значение this
по определению неизменное , вы не можете таким образом изменить то, на что оно ссылается.
В качестве обходного пути можно использовать методы call
или apply
для запуска функции конструктора ObjX
в объекте this
объекта ObjY
:
function ObjY(a,b,c) {
ObjX.call(this, a, b * 12);
this.$c = c;
}
В приведенном выше примере функция ObjX
выполняется с изменением своего значения this
, поэтому все расширения свойств, которые вы делаете для этого объекта в этой функции, будут отражены в новом объекте, на который ссылается значение this
конструктор ObjY
.
Как только метод call
завершится, объект this
будет расширен, и вы сможете сделать больше расширений свойств, например, добавив значение $c
.
Редактировать: Что касается прототипов, ваш образец не будет работать, поскольку свойство prototype
не имеет особого значения для объекта в позициях, оно будет таким же, как и любое другое свойство, его следует использовать в функции конструктора .
Я думаю, вы могли бы спутать свойство конструкторов prototype
с внутренним свойством [[Prototype]]
, которое есть у всех объектов.
Свойство [[Prototype]]
может быть установлено только оператором new
(через внутреннюю операцию [[Construct]]
), это свойство не может быть изменено (хотя некоторые реализации, такие как Mozilla) во-первых, вы можете получить к нему доступ через obj.__proto__;
, а в ECMAScript 5 был введен метод Object.getPrototypeOf
, но я бы не рекомендовал вам напрямую связываться с ним).
На самом деле, когда ваша функция конструктора выполняется, внутреннее свойство [[Prototype]]
объекта, на которое ссылается значение this
, уже было установлено на свойство prototype
его конструктора.
Таким образом, как отмечает @Anurag, вы можете установить ObjY.prototype
для вновь созданного ObjX
объекта:
function ObjY(a,b,c) {
ObjX.call(this, a, b * 12);
this.$c = c;
}
ObjY.prototype = new ObjX();
ObjY.prototype.constructor = ObjY;
Это будет означать, что ваш ObjY
наследует также свойства, добавленные к ObjX.prototype
, и, как вы видите, я изменил ObjY.prototype.constructor
, поскольку назначение в строке выше заставит это свойство ошибочно указывать на ObjX
.
Рекомендуемые статьи: