如何解决真正简单的JavaScript“继承”带有问题的示例
| 我在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提供的跨实现共享资源的机制(原型链)。
令人惊讶的是,与语言中定义的其他对象不一致。我不希望总是将一个对象传递给构造函数,并且我希望将new
与它们一起使用。
没有明确的方法来调用函数的“超级”版本。
题外话:一些注意事项:
“ 3”是JavaScript中的保留字。您不应将其用作标识符,就像您不会使用for
或if
作为标识符一样。
您可以使用功能强大的||
运算符来简化一点,例如:
o.name = o.name || \"Cow\"; // Defaults
, 我自己的问题如下:
document.write(hugo.class == Animal) // true
document.write(hugo.class == Labradore) // false
, 我最近开始使用John Resig \的\“ Simple JavaScript Inheritance \”(简单JavaScript继承)脚本。 (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\"
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。