你可以使用原型继承的模式是什么,你不能用class?

时间:2011-06-07 14:24:14

标签: javascript oop inheritance prototypal-inheritance

每个人似乎都普遍认为原型继承比类继承更简单,更灵活。我在文献中没有看到的,我读过很多关于原型继承的事情的例子,你不能用经典的东西。所以我提出了一个简单的问题:

您可以使用哪些模式可以使用原型继承,而不能使用类继承,以及在使用它时可以给出的指导是什么?

4 个答案:

答案 0 :(得分:2)

一个区别(可能至少在概念上)是类继承意味着子IS-A类型的父类。原型继承没有这样的含义;哺乳动物是猫的原型(Merriam-Webster定义说这意味着它是“模式”),但没有别的。猫可以随意删除/添加/更改行为。

答案 1 :(得分:1)

好的,我将添加一个,使用原型链接对于整类对象的猴子补丁方法是实时的事实:

var Cat = function(catName) {
    this.catName = catName;
};
Cat.prototype.meow = function() {
    console.log(this.catName+" says meow");
}
var mittens = new Cat("Mittens");
var whiskers = new Cat("Whiskers");
mittens.meow(); // "Mittens says meow"
whiskers.meow(); // "Whiskers says meow"

// All cats are now angry
Cat.prototype.meow = function() {
    console.log(this.catName+" says hissssss");
}
mittens.meow(); // "Mittens says hissssss"
whiskers.meow(); // "Whiskers says hissssss"

如果您有对象突然需要以完全不同但一致的方式开始响应某种全局事件,这将非常有用。也许是因为:

  • 主题和皮肤
  • 页面是以“在线模式”还是“离线模式”运行(在线时所有查询都通过ajax存储/检索,而离线查询重定向到浏览器存储)

答案 2 :(得分:0)

由于JavaScript中没有真正的类继承,你可能永远不会找到任何文献来解释你在JavaScript中不能用经典类继承做什么,除非你把它与其他语言中的类继承进行比较。

所以我会把你的问题视为你的意思:

  

您可以在JavaScript原型继承中使用哪些模式,而在支持它的语言中,您无法使用类继承?

R =通常,大多数基于类继承的面向对象语言都会生成具有刚性结构的对象,它们在生命周期中始终具有相同的方法和属性,并且相同类的所有对象都具有相同的结构

因此,一般而言,您可以使用基于原型的语言应用的模式是无法使用类继承语言实现的模式依赖于:

  • 动态添加或删除对象的方法或属性

*这在JavaScript中得到了很好的支持,因为它具有动态的跨域协作性质。有时您需要从其他网站加载外部脚本,但需要添加新功能,而无法更改这些外部库中的源代码。

答案 3 :(得分:0)

我不认为我同意你的前提,但基于原型的继承的主要好处是它允许在类的所有成员上运行时分配属性和方法,即使已经存在该类的实例。 / p>

我的理论家实际上对某些影响感到畏缩。想象一下调试一些你不知道哪一段代码完全重新定义你的类结构的东西。这是令人生畏的。

但是,我会说,它已证明有用:

有一次,当我在ActionScript 3容器内部使用ActionScript 2(不是因为它几乎是一种非确定性的语言)。这个问题的一个未知副作用是它消除了内存级别的想法(对我公司的遗留代码至关重要)。我能够添加一行:MovieClip.prototype._level0 = _root;并解决了问题。

为了反驳我的上述论点,你可以在事实之后修改所有实例的事实确实在你无法访问原始代码库的情况下提供了一定的权力(如示例),但是我除此之外没有任何重大利益。