非常简单的JavaScript“继承”(带问题的示例)

时间:2011-06-14 16:05:29

标签: javascript

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的类概念,使其“感觉”像另一种语言可能节省几行,但似乎没有添加太多的核心功能。但是,我很高兴接受教育:)

有些问题 是否有任何图书馆以这种方式运作? 这样做的优点和缺点的任何在线例子?
是不是有一个根本原因不这样做?
有什么一般想法?

3 个答案:

答案 0 :(得分:4)

这不是真正的继承,它基本上是复制。这里的术语并不一定重要。 : - )

我看到的主要缺点是:

  • instanceof无效
  • 您失去了JavaScript为跨实现(原型链)共享资源提供的机制。
  • 令人惊讶的是,与语言中定义的其他对象不一致。我不希望总是将对象传递给构造函数,我希望将new与它们一起使用。
  • 没有明确的方法来调用“超级”版本的函数。

偏离主题:几点说明:

  • class是JavaScript中的保留字。您不应将其用作标识符,就像不使用forif作为标识符一样。
  • 您可以使用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"
});