在对象实例化期间扩展javascript对象

时间:2014-12-10 03:03:56

标签: javascript class object inheritance prototype

我有一个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

3 个答案:

答案 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
}