我可以构造一个JavaScript对象而不使用new关键字? [英] Can I construct a JavaScript object without using the new keyword?
问题描述
这里是我想做的:
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
有可能吗?我可以通过挂钩 a $ c $来轻松地使
b
成为 a
的实例c>到它的原型链,但是我必须做 new b()
,这是我想要避免的。
Is it possible? I can make b
be an instance of a
easily by hooking a
into its prototype chain but then I have to do new b()
, which is what I'm trying to avoid. Is what I want possible?
更新:我觉得使用 b .__ proto__ = a.prototype
。
更新2:下面是最接近你可以得到的,这是好的对我来说够多的了。感谢所有有趣的答案。
Update 2: Below is what seems to be the closest you can get, which is good enough for me. Thanks all for the interesting answers.
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: href =http://blog.higher-order.net/2008/02/21/javascript-parasitic-inheritance-power-constructors-and-instanceof/ =nofollow noreferrer>power constructors的博文,一旦我添加了必要的 b .__ proto__ = a.prototype
行:
Update 3: I found exactly what I wanted in a blog post on 'power constructors', once I added the essential b.__proto__ = a.prototype
line:
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();
除了这个(相当老的)答案:你可以使用 模块模式 创建对象:
In addition to this (rather old) answer: you can use a module pattern to create an object:
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(jane.get()); //=> This person is called Mary, her age is 17
这是一个 jsFiddle 某些日期
。
这篇关于我可以构造一个JavaScript对象而不使用new关键字?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!