javascript - 非常简单的 JavaScript "Inheritance"(有问题的例子)

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

一些问题
是否有以这种方式工作的库?
是否有关于这样做的优缺点的在线示例?
是否有不这样做的根本原因?
有什么一般性的想法吗?

最佳答案

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

我看到的主要缺点是:

  • instanceof 不会工作
  • 您失去了 JavaScript 提供的跨实现共享资源的机制(原型(prototype)链)。
  • 这很奇怪,与语言中定义的其他对象不一致。我不希望总是必须将对象传递给构造函数,我希望对它们使用 new
  • 没有明确的方法来调用函数的“ super ”版本。

题外话:几点说明:

  • class 是 JavaScript 中的保留字。您不应该将它用作标识符,就像您不会将 forif 用作标识符一样。
  • 您可以使用 curiously-powerful || operator 稍微简化一下,例如:

    o.name = o.name || "Cow"; // Defaults
    

关于javascript - 非常简单的 JavaScript "Inheritance"(有问题的例子),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6346553/

相关文章:

javascript - YouTube API : How to upload thumbnail (JS)

javascript - 这个 JavaScript 语法是如何工作的?

javascript - 在没有任何操作的情况下重新加载,切换功能正在工作,但由于重新加载影响消失了

javascript - react js : Accessing state of other components

javascript - Couchdb Map函数获取两个日期之间的数据

javascript - 将属性指令传递给元素指令

javascript - 页面加载时只加载一个 JavaScript 函数。

c# - 使用参数从 JavaScript 调用 CodeBehind 方法

javascript - 如何使jquery无限重复循环

javascript - 通过回调异步访问 $get