I also have this running example on jsfiddle
示例:
function Animal(o) {
o.class = Animal;
o.name = o.name ? o.name : "Animal"; // Defaults
o.age = o.age ? o.age : 0; // Defaults
o.weight = o.weight ? o.weight : 0; // Defaults
o.say = o.say ? o.say : "?";
Animal.isOnEarth = true; // "static variable"
return o;
}
function Cow(o) {
o.class = Cow;
o.name = o.name ? o.name : "Cow"; // Defaults
o.milk = o.milk ? o.milk : 0; // Defaults
o.say = o.say ? o.say : "MOOO";
return Animal(o); //Inheritence
}
function Dog(o) {
o.class = Dog;
o.isCrazyLab = o.isCrazyLab ? o.isCrazyLab : false;
o.say = o.say ? o.say : "WOOF";
return Animal(o) //Inheritence;
}
function Labradore(o) {
o.class = Labradore;
o.isCrazyLab = o.isCrazyLab ? o.isCrazyLab : true;
o.say = o.say ? o.say : "YARRWL";
return Dog(o) //Inheritence;
}
var cow = Cow({});
var bessy = Cow({name:"bessy",milk:25});
var spot = Dog({name:"spot"});
var hugo = Labradore({name:"hugo"});
document.write("True or false, all these animals live on earth " + Animal.isOnEarth + " A cow says " + cow.say + "... bessy's name is " + bessy.name + " a " + spot.name + " says " + spot.say + " " + hugo.name + " says " + hugo.say);
我有一个正在处理的小项目,我想实现一种继承。我在网上查看了一些示例,但我不太明白为什么在 javascript 中完成所有修改基本行为的繁琐程序很重要。对我来说,这感觉就像扩展 javascript 的类概念以使其“感觉”像另一种语言可能会节省几行代码,但似乎不会添加太多核心功能。不过,我很高兴接受教育 :)
一些问题
是否有以这种方式工作的库?
是否有关于这样做的优缺点的在线示例?
是否有不这样做的根本原因?
有什么一般性的想法吗?
最佳答案
那不是真正的继承,它基本上是复制。术语在这里不一定很重要。 :-)
我看到的主要缺点是:
instanceof
不会工作- 您失去了 JavaScript 提供的跨实现共享资源的机制(原型(prototype)链)。
- 这很奇怪,与语言中定义的其他对象不一致。我不希望总是必须将对象传递给构造函数,我希望对它们使用
new
。 - 没有明确的方法来调用函数的“ super ”版本。
题外话:几点说明:
class
是 JavaScript 中的保留字。您不应该将它用作标识符,就像您不会将for
或if
用作标识符一样。您可以使用 curiously-powerful
||
operator 稍微简化一下,例如:o.name = o.name || "Cow"; // Defaults
关于javascript - 非常简单的 JavaScript "Inheritance"(有问题的例子),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6346553/