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的类概念,使其“感觉”像另一种语言可能节省几行,但似乎没有添加太多的核心功能。但是,我很高兴接受教育:)
有些问题
是否有任何图书馆以这种方式运作?
这样做的优点和缺点的任何在线例子?
是不是有一个根本原因不这样做?
有什么一般想法?
答案 0 :(得分:4)
这不是真正的继承,它基本上是复制。这里的术语并不一定重要。 : - )
我看到的主要缺点是:
instanceof
无效new
与它们一起使用。偏离主题:几点说明:
class
是JavaScript中的保留字。您不应将其用作标识符,就像不使用for
或if
作为标识符一样。您可以使用curiously-powerful ||
operator简化一下,例如:
o.name = o.name || "Cow"; // Defaults
答案 1 :(得分:2)
我自己的问题如下:
document.write(hugo.class == Animal) // true
document.write(hugo.class == Labradore) // false
答案 2 :(得分:1)
我最近开始使用John Resig的“Simple JavaScript Inheritance”脚本。 (John Resig是负责jQuery的人:天才。如果你还没有,我强烈建议阅读他的帖子。
这种语法看起来更清晰,更不容易出错:
var Animal = Class.extend({
name : "Animal",
age : 0,
weight : 0,
say : "?"
});
Animal.isOnEarth = true; // "static variable"
var Cow = Animal.extend({
name: "Cow",
milk: 0,
say: "MOOO"
});