Child 函数重写了 Parent.prototype 对象,将其设置为一个新的 Parent 实例,为什么要设置为新的parent,不使用new命令设置不可以吗,这样不是会在他们的原型链上多一条空链吗
时间: 2024-03-25 18:38:51 浏览: 69
你提出的问题是非常好的,确实在这段代码中存在一些问题。
首先,我们要清楚 `Child.prototype = new Parent()` 这一行代码的作用是将 `Child` 的原型对象设置为一个新的 `Parent` 实例。这样做的目的是为了让 `Child` 实例可以继承 `Parent` 的属性和方法。但是这种做法有一个问题,就是会调用 `Parent` 构造函数来创建一个新的对象,然后将这个新对象赋值给 `Child.prototype`。这样一来,`Child.prototype` 对象上就会多出一些继承自 `Parent` 的属性,而这些属性是不需要的。因此,这种做法会导致一些不必要的资源浪费和对象属性冗余。
为了避免这种问题,我们可以使用 `Object.create()` 方法来创建一个空对象作为 `Child.prototype` 的原型对象,这样就不会出现多余的属性。具体的做法是将 `Child.prototype` 设置为 `Object.create(Parent.prototype)`,这样就可以将 `Child.prototype` 的原型对象设置为一个空对象,同时保证它能够继承 `Parent.prototype` 的属性和方法,而不会多出不必要的属性。
因此,正确的做法应该是这样的:
```javascript
function Parent(name) {
this.name = [name];
}
Parent.prototype.getFullName = function() {
let [name1, ...name2] = this.name.join(",").split("");
return name1 + "·" + name2;
};
function Child() {
Parent.call(this, "纳西妲");
}
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
let child1 = new Child();
let child2 = new Child();
```
这样就可以避免在原型链上出现多余的属性,同时保证 `Child` 实例能够正确地继承 `Parent` 的属性和方法。
阅读全文