JavaScript中的差异继承是什么?

JavaScript中的差异继承是什么?,javascript,prototype,Javascript,Prototype,这是关于差异继承的。它接着说: 此方法允许您轻松实现差异继承, 其中对象可以直接从其他对象继承 据我所知,JavaScript总是允许对象通过原型继承直接从其他对象继承。JavaScript中没有类的概念。那么差异继承到底意味着什么?为什么称之为差异继承 注:不久前,我对这个答案发表了评论,但没有收到任何回复。因此,我想与众多优秀的JavaScript用户进行交流。正如其他评论者和他们链接的文章所建议的那样,差异继承“只是”普通的、已知的原型继承 然而,通过使用术语差分继承,您关注的是一种比Ja

这是关于差异继承的。它接着说:

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

据我所知,JavaScript总是允许对象通过原型继承直接从其他对象继承。JavaScript中没有类的概念。那么差异继承到底意味着什么?为什么称之为差异继承


注:不久前,我对这个答案发表了评论,但没有收到任何回复。因此,我想与众多优秀的JavaScript用户进行交流。

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

然而,通过使用术语差分继承,您关注的是一种比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大师提倡在任何地方都使用纯模式(以便更好地理解正在发生的事情),并且很高兴得到
对象。使用EcmaScript 5创建

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

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

区分差异遗传和原型遗传绝对没有直线。

显然,这只是“原型遗传”的另一种说法。@Sheikheera:事实上没有,因为这里给出的例子不起作用,而且至少有误导性。@Bergi,误导性?那么什么是正确的引导,任何您自己或参考的示例?@Sheikheera:正在处理:-)对象.prototype.clone
方法应该是一个直接的
返回对象。创建(此)
,那么MDN上的示例就更有意义了。Edit:Ah更好。
init()
Object.create()
有第二个参数:属性。这可以用来更优雅地填充实例属性,如OP链接()中所述。@Steve:更优雅?我对此表示怀疑,因为它需要属性描述符,而不是简单的属性。如果您想要“普通”(可写、可枚举)属性,那么其中包括大量样板文件。