这可能不可能,但我很好奇。是否可以使用公共工厂方法定义私有构造函数?
function MyParentClass() {}
MyParentClass.prototype.init = function() { ... }
function MyChildClass() {}
MyChildClass.prototype = new MyParentClass();
MyChildClass.prototype.init = function() {
...
MyParentClass.prototype.init.apply(this);
...
}
MyChildClass.Create = function() {
var instance = new MyChildClass();
instance.init();
return instance;
}
是否可以隐藏2个构造函数并仅显示Create()?
这种可覆盖的init()方法的其他方法也是受欢迎的。谢谢。
答案 0 :(得分:8)
我不确定您要实现的目标,但这里有一个示例,其中MyClass
是一个单身人士,其工厂方法create
允许创建MyClass
实例
//MyClass will be an object with a create method only
var MyClass = (function() {
function MyClass() {
this.initialized = false;
}
MyClass.prototype = {
init: function () {
this.initialized = true;
return this;
}
};
return {
create: function () {
return new MyClass().init();
}
};
})();
var m = MyClass.create();
console.log(m);
console.log(m.constructor); //Will be Object because we replaced the whole prototype
但是,我不确定你为什么要有两个构造函数(init
和constructor
本身)?您是否试图将对象创建过程抽象出来,因为它很复杂?
我怀疑你只是想将constructor
逻辑移动到另一个函数中,因为你试图实现继承。
您是否只是在尝试避免在执行以下操作时调用构造函数逻辑?
MyChildClass.prototype = new MyParentClass();
如果是这种情况,使用Object.create
可以解决您的问题(旧版浏览器不支持,但是它有一个垫片 - 垫片支持功能你需要,但不是Object.create
做的所有事情)。
function A(test) {
this.test = test;
}
function B(test) {
A.call(this, test); //call parent constructor
}
B.prototype = Object.create(A.prototype); //inherit from A
var b = new B('test');
console.log(b);
console.log(b instanceof A); //true
您还可以使用纯原型方法,而不将constructor
函数与new
关键字一起使用。
var A = {
init: function (test) {
this.test = test;
return this;
}
},
B = Object.create(A),
b;
//override constructor function
B.init = function (test) {
return A.init.call(this, test);
};
b = Object.create(B).init('test');
console.log(b);