这在技术上是可行的,但您可以更优雅地解决您的问题(解释如下):
function mything() {
var a, b, c;
function PrivateConstructor() {
this.publicFunc = function() {}
}
// this is the magic that makes it happen:
PrivateConstructor.prototype = mything.prototype;
return new PrivateConstructor();
}
mything1 = mything();
assert(mything1 instanceof mything); // passes
或者,使用 EcmaScript 5 功能:
function mything() {
var a, b, c;
var object = Object.create(mything.prototype);
object.publicFunc = function() {}
return object;
}
mything1 = mything();
assert(mything1 instanceof mything); // passes
解释
instanceof
如果右侧操作数是一个函数,并且存储在该函数属性中的对象包含在左侧操作数的原型链中,则运算符将返回true prototype
。
第一个示例mything.prototype
将另一个临时函数作为“原型”属性重用,该函数仅用于生成一个对象(mything.prototype
在其原型链中)。第二个示例通过mything.prototype
直接从 with继承来创建这样的对象Object.create()
。
两个对象都继承自mything.prototype
并因此将通过object instanceof mything
测试。
话虽如此,jfriend00 提出的模式开销更少,并且更易于阅读,同时提供了您想要的功能。