Могу ли я создать объект JavaScript без использования нового ключевого слова?

Вот что я хотел бы сделать:

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

Ответы на вопрос(13)

Ваш ответ на вопрос