当它是子类的实例时,如何获取对象的类名?

时间:2013-05-02 17:45:30

标签: javascript constructor prototype subclass classname

假设我们有一个抽象类Animal:

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

然后我们有一个Duck类:

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

所以,我正在写一个Greasemonkey脚本,我真的需要在localstorage中保存一些动物,以便在下次加载页面时检索它们(这种方式允许我重新创建我在reaload页面之前的相同实例)。

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

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

但是当我这样做时,我在控制台上获得了“ClassName:Animal”。 P / d:我不能用原型改变编程风格,这是一个要求...... :(

有什么建议吗? 谢谢你的时间!

3 个答案:

答案 0 :(得分:2)

Duck.prototype = new Animal();

这段代码错了;做原型继承的正确方法有点more complicated

如果你无法直接更改它,你仍然可以在Greasemonkey中修复它:

Duck.prototype.constructor = Duck;

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

答案 1 :(得分:2)

(不完美,但是)正确的方法将首先在Animal的上下文中调用Duck构造函数

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

然后你做了什么:

Duck.prototype = new Animal();

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

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

PS:不要冒犯@Slack提供的更复杂的链接使用新的JavaScript方法 Object.create 来完成。 JavaScript<没有回退。 1.8。我觉得OO JS at MDN解释了对旧JS的更好(但并非完美)的尝试

Object.create已经为您想要实现的继承做好了准备(Child类扩展了Parent):

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

Object.create perfect-izes 上述方法,俗称Crockford's Prototypal Inheritance Way,并以原生方式实现。
但仅在现代版本的浏览器中可用(我知道这是现在的主要部分)

答案 2 :(得分:0)

要询问对象ID,询问对象类是一样的。解决方案是双重调度。见这里:http://en.wikipedia.org/wiki/Double_dispatch