gpt4 book ai didi

设置原型(prototype)时Javascript继承: calling Object.创建

转载 作者:数据小太阳 更新时间:2023-10-29 04:10:46 25 4
gpt4 key购买 nike

我正在学习面向对象的 Javascript 的某些方面。我遇到了这个片段

var Person = function(firstName, lastName)
{
this.lastName = lastName;
this.firstName = firstName;
};

Object.defineProperties(Person.prototype, {
sayHi: {
value: function() {
return "Hi my name is " + this.firstName;
}
},
fullName: {
get: function() {
return this.firstName + " " + this.lastName;
}
}
});

var Employee = function(firstName, lastName, position) {
Person.call(this, firstName, lastName);
this.position = position;
};

Employee.prototype = Object.create(Person.prototype);

var john = new Employee("John", "Doe", "Dev");

我的问题是:为什么这个片段使用对象.create(Person.prototype)?我们不应该简单地重置原型(prototype):

Employee.prototype = Person.prototype;

最佳答案

做 Employee.prototype = Person.prototype 就像在说“Employee is Person”而不是“Employee is a Person”。对任一原型(prototype)的任何更改都将反射(reflect)在两个类中。

这是一个 demonstration .显然,我们不希望我们的人员工作,因为他们没有职位。

所以在没有 Object.create 的情况下设置原型(prototype)链的正确方法是:

Employee.prototype = new Person;

但这需要实例化一个对象,这有点古怪——尤其是如果您不想调用 Person 的构造函数时。您的所有 Employee 实例都将继承未定义的“firstName”和“lastName”属性,无论您是否希望这样做。

在这种情况下,这没什么大不了的——Employee 构造函数将在其自身上设置这些属性,这将取代从 Person 继承的属性。但请考虑 this example .有人可能认为 freeTime 是 Person 的实例级属性,不会被复制,因为它不在原型(prototype)上。另外,我们从未从 Employee 调用 Person 构造函数。并非如此 -- freeTime 在 Employee 原型(prototype)上设置的,因为我们必须实例化一个对象。

因此,您可以做的最好和最干净的继承是通过 Object.create。如果你想调用父类的构造函数,你可以在子类的构造函数中显式调用。另一件好事是 Object.create 有第二个(可选)参数给 defineProperties。所以你也可以这样做:

Employee.prototype = Object.create(Person.prototype, {
work: {
value: function() {
return this.fullName+" is doing some "+this.position+" stuff");
}
}
});

当然,如果您必须支持旧版浏览器,则不能使用 Object.create。另一种方法是使用 clone/extend from libraries like underscore or lodash。或者有这个小舞蹈:

var subclass = function() { };
subclass.prototype = Person.prototype;
Employee.prototype = new subclass;

关于设置原型(prototype)时Javascript继承: calling Object.创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15045080/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com