Gee*_*eek 8 javascript prototype
这篇关于Object.create()JavaScript中的方法的答案谈到了差异继承.它接着说:
此方法允许您轻松实现差异继承,其中对象可以直接从其他对象继承.
据我所知,JavaScript总是允许对象通过原型继承直接从其他对象继承.JavaScript中没有类的概念.那么差异继承真正意味着什么呢?为什么这样称呼呢?
PS:我在一段时间后对该答案发表了评论,但我没有收到任何回复.所以想要与更大,更棒的SO 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();
Run Code Online (Sandbox Code Playgroud)
正如你所看到的那样创建一个Jane很简单,但是new Constructor()如果我们使用它,我们将不得不打破这个模式.这就是为什么一些JS大师们主张在任何地方使用纯模式(以便你更好地理解正在发生的事情)并且很高兴能够Object.create使用EcmaScript 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");
Run Code Online (Sandbox Code Playgroud)
绝对没有区分差异和原型继承的直线.
| 归档时间: |
|
| 查看次数: |
3232 次 |
| 最近记录: |