2013-05-02 72 views
0

假设我们有一个抽象类动物:当它是一个子类的实例时如何获取对象的类名?

function Animal(){}; 
Animal.prototype.communicate = function(metadata){ 
    //ABSTRACT 
}; 

然后我们有一个鸭类:

function Duck(){}; 
Duck.prototype = new Animal(); 
Duck.prototype.communicate = function(metadata){ 
    console.log("Cuack!"); 
}; 

所以,我一个书面方式的Greasemonkey脚本,我真的需要节省一些动物localstorage在下次加载页面时检索它们(这样可以重新创建与reaload页面相同的实例)。

所以,我真的需要创建每个动物的类名称。我读了另一个类似的问题,他们得到的类名的方法是:

var aDuck = new Duck(); 
console.log("ClassName: " + aDuck.constructor.name); 

但是当我这样做,我得到“产品类别:动物”在控制台上。 P/d:我不能改变编程风格与原型,它是一个要求... :(

任何建议 感谢您的时间

回答

0

要问对象ID它是同样的东西要求对象类。解决方案是双重调度。看到这里:http://en.wikipedia.org/wiki/Double_dispatch

+0

感谢您发布您的答案!请注意,你应该在这里发布答案的有用点。 [请参阅常见问题解答,其中提到的答案几乎不超过链接](http://stackoverflow.com/faq#deletion)。如果您愿意,您可能仍然包含链接,但仅作为“参考”。答案应该独立,不需要链接。 – 2013-05-22 15:23:35

+0

已编辑!谢谢! – gal007 2013-05-25 22:22:54

2
Duck.prototype = new Animal(); 

这段代码是错误的;的?!做原型继承正确的做法是有点more complicated

如果你不能直接改变它,你仍然可以修复它的Greasemonkey:

Duck.prototype.constructor = Duck; 

您需要为每个班级都做到这一点。

+0

谢谢SLaks!你能告诉我做原型继承的正确方法吗?也许让我改变继承方式:) – gal007 2013-05-02 17:51:47

2

的(并不完美,但)正确的方法是,首先调用Duck的背景下

function Duck() { 
    Animal.call(this); 
} 

Animal构造函数,然后你做了什么:

Duck.prototype = new Animal(); 

然后明确地使Duck的实例的构造函数指向Duck

Duck.prototype.constructor = Duck; 
// so that all new Duck() 's constructor point to Duck 

PS:不要得罪,由@Slack给出的更复杂链路使用Object.create,新的JavaScript方法,做到这一点。有没有回退的JavaScript < 1.8。我觉得OO JS at MDN解释为老年人JS

Object.create一个更好的(但并不完美)的尝试已经进入照片在这个非常继承要实现(子类扩展父):

function inherits(Parent, Child) { 
    function F() {} 
    F.prototype = Parent; 
    Child.prototype = new F(); 
} 

Object.createperfect-izes上述方法,着名地被称为Crockford's Prototypal Inheritance Way并实现它本地。
但是只有现代版本的浏览器(我知道现在是主要份额)可用

相关问题