8

这个关于SO 中 JavaScript 方法的答案Object.create()谈到了差异继承。它继续说:

这种方法允许您轻松实现差异继承,其中对象可以直接从其他对象继承。

据我所知,JavaScript 总是允许对象通过原型继承直接从其他对象继承。JavaScript中没有类的概念。那么差分继承的真正含义是什么,为什么这么称呼它呢?

PS:我前段时间对该答案发表了评论,但我没有收到任何回复。所以想与更大、更棒的 SO JavaScript 用户社区核实一下。

4

1 回答 1

9

正如其他评论者和他们链接的文章已经建议的那样,差异继承“只是”正常的,已知的原型继承。

然而,通过使用术语差分继承,您可以专注于一种比 JavaScript 中已知的更纯粹的模式(尽管在其他原型语言中很常见,如 Self、NewtonScript 或 Io)。与伪经典模式不同,根本没有new使用的构造函数。相反,通过使用Object.create您在一个步骤中创建一个从目标对象继承的新对象,然后手动(而不是使用构造函数)创建必要的实例属性(仅那些不同的)。从您认为是实例的对象继承而不是从专用原型对象继承并不罕见。

var object = Object.prototype;

// a Person constructor and a Person.prototype method would be more familiar
var person = Object.create(object);
person.greet = function() { 
    console.log("Hi, I'm "+this.firstName+" "+this.lastName);
};

// as would new Person("John", "Doe");
var jo = Object.create(person);
jo.firstName = "John";
jo.lastName = "Doe";

// but what now? We stay with "simple" Object.create here
var ja = Object.create(jo);
ja.firstName = "Jane";

jo.greet();
ja.greet();

如您所见,创建 Jane 很简单,但new Constructor()如果我们使用它,我们将不得不打破这种模式。这就是为什么一些 JS 大师提倡在任何地方都使用纯模式(以便您更好地理解发生了什么)并且很高兴收到Object.createEcmaScript 5。

尽管如此,使用构造函数模式和构建传统的类层次结构是常见且有用的,并且在原型语言中确实是可能的。例如,Io 将在init您每次使用对象时调用一个方法(如果存在)clone,在上面的示例中,我们也可以使用一个方法,这会使 Joe 的初始化更简单:

person.init = function(f, l) {
   this.firstName = f; this.lastName = l; return this;
}
var jo = Object.create(person).init("John", "Doe");

绝对没有直线可以区分差异继承和原型继承。

于 2013-07-22T22:01:09.290 回答