0

假设我们有一个抽象类 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 中保存一些动物,以便在下次加载页面时检索它们(这种方式允许我重新创建与重新加载页面之前相同的实例)。

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

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

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

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

4

3 回答 3

2
Duck.prototype = new Animal();

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

如果不能直接改,还是可以在 Greasemonkey 中修复:

Duck.prototype.constructor = Duck;

您需要为每个班级都这样做。

于 2013-05-02T17:47:47.927 回答
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 给出的更复杂的链接使用Object.create新的 JavaScript 方法来做到这一点。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's Prototypal Inheritance Way并在本地实现它。
但仅在现代版本的浏览器中可用(我知道这是现在的主要份额)

于 2013-05-02T19:48:30.863 回答
0

询问对象 ID 与询问对象类相同。解决方案是双重调度。见这里:http ://en.wikipedia.org/wiki/Double_dispatch

于 2013-05-22T14:51:02.200 回答