假设我们有一个抽象类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:我不能用原型改变编程风格,这是一个要求...... :(
有什么建议吗? 谢谢你的时间!
答案 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