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

How to get the object's class name when it is an instance of a subclass?

本文关键字:子类 实例 类名 取对象 何获      更新时间:2023-09-26

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

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

然后我们有一个鸭子类:

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

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

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

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

但当我这样做时,我会在控制台上看到"ClassName:Animal"。P/d:我不能用原型改变编程风格,这是一个要求…:(

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

Duck.prototype = new Animal();

这个代码是错误的;进行原型继承的正确方法稍微复杂一些。

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

Duck.prototype.constructor = Duck;

每节课你都需要这样做。

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

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

附言:无意冒犯,@Slack提供的更复杂的链接使用了新的JavaScript方法Object.create。JavaScript<1.8.我觉得MDN的OO JS解释了旧JS 的更好(但不完美(尝试

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

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

Object.create完善了上述方法,即著名的Crockford原型继承方法,并在本地实现了它
但仅在现代版本的浏览器中可用(我知道这是现在的主要共享(

询问对象ID与询问对象类是一样的。解决方案是双重调度。请参见此处:http://en.wikipedia.org/wiki/Double_dispatch