我可以在不使用新关键字的情况下构建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成为一个容易的实例,通过挂钩到它的原型链,但是我必须做新的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:我在blog post on ‘power constructors’中找到了我想要的,一旦我添加了必要的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
最佳答案
您可以使用此模式:

function SomeConstructor(){
   if (!(this instanceof SomeConstructor)){
        return new SomeConstructor();
   }
   //the constructor properties and methods here
}

之后你可以做:

var myObj = SomeConstructor();

除了这个(相当老的)答案:您可以使用module pattern创建一个对象:

function Person(name, age, male) {
  name = name || 'unknown';
  age = age || 0;
  function get() {
    return ['This person is called ', name,
            (!male ? ', her' : ', his'),' age is ',
            age].join('');
  }
  function setAge(nwage) {
     age = nwage;
  }
  return Object.freeze({get: get, setAge: setAge});
}
// usage
var jane =  Person('Jane', 23)
   ,charles = Person('Charles', 32, 1)
   ,mary = Person('Mary', 16);

console.log(jane.get()); //=> This person is called Jane, her age is 23
mary.setAge(17);
console.log(mary.get()); //=> This person is called Mary, her age is 17

这是我使用该模式创建的一些Date功能的一个jsFiddle.

转载注明原文:我可以在不使用新关键字的情况下构建JavaScript对象吗? - 代码日志