Вот что я хотел бы сделать:
function a() {
// ...
}
function b() {
// Some magic, return a new object.
}
var c = b();
c instanceof b // -> true
c instanceof a // -> true
b instanceof a // -> true
Возможно ли это? Я могу сделать b
легко экземпляром a
, подключив a
к своей цепочке прототипов, но тогда мне нужно сделать new b()
, чего я пытаюсь избежать. Я хочу, чтобы это было возможно?
Обновление: Я чувствую, что это возможно при разумном использовании b.__proto__ = a.prototype
. Я буду экспериментировать больше после работы.
Обновление 2: Ниже приводится то, что кажется самым близким, которое вы можете получить, что достаточно для меня. Спасибо всем за интересные ответы.
function a() {
// ...
}
function b() {
if (!(this instanceof arguments.callee)) {
return new arguments.callee();
}
}
b.__proto__ = a.prototype
var c = b();
c instanceof b // -> true
c instanceof a // -> false
b instanceof a // -> true
Обновление 3: Я нашел именно то, что я хотел в блоге в блоге "конструкторы мощности" , как только я добавлена существенная строка b.__proto__ = a.prototype
:
var object = (function() {
function F() {}
return function(o) {
F.prototype = o;
return new F();
};
})();
function a(proto) {
var p = object(proto || a.prototype);
return p;
}
function b(proto) {
var g = object(a(proto || b.prototype));
return g;
}
b.prototype = object(a.prototype);
b.__proto__ = a.prototype;
var c = b();
c instanceof b // -> true
c instanceof a // -> true
b instanceof a // -> true
a() instanceof a // -> true