2012-06-12 76 views
0

我想要做的是这样的:的Javascript功能转换声明为功能字典原型

我的基本代码:

var Obj = function() { 
    this.do = function() {}; 
    this.stop = function() {}; 
    this.kill = function() {}; 
}; 

Obj.prototype.load = function() {}; 

需要的转换:

var ConvObject = function() { }; 
ConvObject.prototype = (typeof Obj == "function")? new Obj : Obj; 

这示例作品(用于转换部分)。在ConvObject中,Obj的所有方法都在那里。但在我的情况下,我不想执行Obj的默认构造函数。我宁愿避免这一点。的确,我不想执行新的Obj。

我试过不同的方法来完成这个。这里是最好的答案我可以现在发现:

var getSizeOf = function(obj) { 
    var size = 0, key; 
    for (key in obj) { 
    if (obj.hasOwnProperty(key)) size++; 
    } 
    return size; 
}; 

var ConvObject = function() { }; 
if ((typeof Obj == "function") && getSizeOf(Obj.prototype) == 0) { 
    ConvObject.prototype = new Obj; 
} 
else { 
    ConvObject.prototype = (typeof Obj == "function")? Obj.prototype : Obj; 
} 

这工作时的OBJ看起来是这样的:

var Obj = new function() {}; 
Obj.prototype.do = function() {}; 
Obj.prototype.stop = function() {}; 
Obj.prototype.kill = function() {}; 
Obj.prototype.load = function() {}; 

或者,如果它看起来像这样:

var Obj = function() { 
    this.do = function() {}; 
    this.stop = function() {}; 
    this.kill = function() {}; 
    this.load = function() {}; 
}; 

但是,这解决方案失败时,我有上面的基本代码。我怎样才能避免这个调用默认的构造函数? 感谢您的帮助!

+1

是的,但他不想调用构造函数。由于在这种情况下构造函数的代码是将属性添加到对象的唯一方法,因此只能通过调用构造函数来获取它们。 – Pointy

+0

你是对的。我必须调用构造函数才能拥有这些功能。谢谢你的回答! – Jeep87c

回答

1

使用Object.create()(或其polyfill)从Obj.prototype直接继承。

要从Obj构造“继承”的实例方法,你应该把它在每一个ConvObjectVery simple Javascript inheritance。无论如何,当这些方法是特定于实例的时候,您都需要这样做,否则它们应该放在原型上。

+0

的确,这个解决方案避免了对构造函数的调用。感谢您的回答,但是,Pointy让我意识到我想要的是不可能的。 – Jeep87c

+0

哦,还有一个解决方案。正如Pointy所说,当然你需要调用构造函数。 – Bergi