我有一个javascript类库,它们使用John Resig的简单Javascript继承库(http://ejohn.org/blog/simple-javascript-inheritance/)相互继承 我的一个类(让我们称之为父)有许多子类( parent.child1 , parent.child2 ,等)扩展父类并添加自己的方法。 通常,我会通过
实例化一个子对象ob=new parent.child1(ops)
但是,当我实例化父对象时,创建选项哈希可以包含一个名为 type 的成员,它告诉我该对象实际上必须是孩子对象。
ob= new parent({type:"child1"});
在对象创建过程中,如何确保创建的对象是 parent.child1 的实例?如果不可能,我怎样才能确保至少创建的对象具有parent.child1.prototype
的所有方法和属性?
提前致谢
编辑:更好的例子是有一个名为 employee 的类,然后是两个继承自 employee 的类,名为 employee.engineer 和< EM> employee.admin
答案 0 :(得分:1)
function Parent(options) {
if(options.type) return new Parent[options.type]();
}
Parent.prototype.foo = 'foo';
Parent.Child = function() {
this.bar = 'bar';
};
Parent.Child.prototype = Object.create(Parent.prototype);
Parent.Child.prototype.constructor = Parent.Child;
var obj = new Parent({type:"Child"});
obj instanceof Parent; // true
obj instanceof Parent.Child; // true
obj.constructor; // Parent.Child
obj.foo; // 'foo'
obj.bar; // 'bar';
答案 1 :(得分:1)
尝试这样的事情......
var ob = new parent[type]( ops );
另外,请阅读有关工厂方法或工厂模式的信息: http://addyosmani.com/resources/essentialjsdesignpatterns/book/#factorypatternjavascript
答案 2 :(得分:0)
感谢Oriol的建议,我提出了解决方案: 这是John Resig的库的一部分,它对应于类的构造函数:
// The dummy class constructor
function Class() {
// All construction is actually done in the init method
if ( !initializing && this.init )
this.init.apply(this, arguments);
}
我稍微修改了一下:
// The dummy class constructor
function Class() {
// All construction is actually done in the init method
if ( !initializing && this.init ){
var ret=this.init.apply(this, arguments);
if(ret) return ret;
}
}
现在,在我的员工类 init 方法中,我从:
开始init:function(ops){
if(ops.type)
return new employee[ops.type];
//rest of init method
}