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

标签 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 脚本,我确实需要在本地存储中保存一些动物,以便在下次加载页面时检索它们(这种方式允许我重新创建与重新加载页面之前相同的实例) )。

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

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

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

有什么建议吗? 感谢您的宝贵时间!

最佳答案

Duck.prototype = new Animal();

这段代码是错误的;原型(prototype)继承的正确做法有点more complicated .

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

Duck.prototype.constructor = Duck;

您需要为每个类(class)执行此操作。

关于javascript - 当对象是子类的实例时,如何获取对象的类名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16344456/

相关文章:

c++ - 类型名称后的括号是否与 new 有所不同?

java - ProtoBuf 的媒体类型

javascript - 从原型(prototype)中选定的复选框获取innerHTML文本

javascript - 保存文件 Python - IOError 权限被拒绝

javascript - 解释 document.getelementbyid.innerhtml 如何打印文本

java - 构造后如何执行子类继承的initialize方法?

java - Java构造函数中的StringBuffer?

javascript - 通过伪经典实例化(JavaScript)掌握原型(prototype)继承

javascript - 如何突出显示未通过 Struts2 验证的字段?

javascript - `x < y && y > x` 有任何理由吗?