如何获取对象's类名,当它是子类的实例时
How to get the object's class name when it is an instance of a subclass?
假设我们有一个抽象类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
相关文章:
- 为什么无法在TypeScript中导出类实例
- 如何检查 JavaScript 对象是否直接是“{}”实例,而不是子类
- 在主类中分配类的实例并保留子类实例的上下文
- 为什么 Object#create 必须在子类的实例化之前
- RxJS 5子类Observable-静态方法返回父类的实例
- 用父属性实例化子类的Javascript
- Javavscript在实例化时更改子类属性
- Javascript:从返回超类实例的函数中设置子类原型的好处
- 为什么不't在babel节点下的Error子类实例上的工作实例
- 如何在JavaScript中进行继承,而不会在子类的所有实例之间共享父类的相同实例?
- 为什么基类的对象属性与子类的所有实例共享?
- JavaScript:从父类实例中创建子类
- 为什么原型继承子类是另一个子类的实例?
- 如何获取对象's类名,当它是子类的实例时
- 如何从子类访问超类实例变量
- 在ES6 / ES2015中容易实例化子类数组
- 如何选择类的每个实例的子类
- 我可以实例化一个超类,并根据提供的参数实例化一个特定的子类吗
- 适当地扩展数组,保持子类的实例
- 子类如何获得超类'实例变量