gpt4 book ai didi

javascript - 如何在没有第三个对象垫片的情况下进行继承?

转载 作者:行者123 更新时间:2023-12-02 16:19:19 24 4
gpt4 key购买 nike

我尝试理解 JavaScript 中的 OOP。我想创建对象 Person 和 Worker。 Worker继承Person。我写的代码:

function Person(name, age) {
this.name = name;
this.age = age;
}

Person.prototype.grow = function () {
this.age++;
console.log('Person grows, new age ' + this.age);
};

function Worker(name, age, position) {
// How to call parrent constructor Person?
this.position = position;
}

Worker.prototype = Person.prototype;
Worker.constructor = Worker.prototype.constructor;

Worker.prototype.promote = function () {
console.log('Worker ' + this.name + ' became Senior ' + this.position);
};

Worker.prototype.grow = function () {
this.promote();
// How to call parrent method grow?
};

var workerObj = new Worker('Ben', 39, 'engineer');

workerObj.grow();

但是在 JS 中,变量赋值通过引用和表达式进行工作 Worker.prototype = Person.prototype; 没有得到结果,Worker 中的方法增长会覆盖 Person 中的方法增长,我将无法访问父方法。

我知道我需要使用第三个对象。但是有没有办法在没有第三个对象的情况下继承呢?

最佳答案

正如您所注意到的,将函数的 .prototype 属性设置为同一个对象本质上使它们成为同一个类。 你真正需要的是 Person.prototype 成为一个继承自 Worker.prototype 的对象。但是您需要在不调用 Person 构造函数的情况下执行此操作,因为这会在原型(prototype)链中留下一些副作用(它们在您提到的情况下并不重要,但在其他情况下可能很重要)。因此 Worker.prototype = new Person(); 并不是您的理想解决方案。

Object.create() 适用于此。除此之外,此函数可用于创建从另一个继承的对象,无需调用任何构造函数。对于您所说的情况,它看起来像这样:

Worker.prototype = Object.create(Person.prototype);
Worker.prototype.constructor = Worker;

Object.create 在旧版本的 IE 中不起作用,并且由于引擎限制,完整的 polyfill 不可用。但是Object.create 的polyfills 可以很好地支持这种子类化,因此浏览器支持不一定是问题。

我通常将其包装在一个函数中,这样一旦定义了子类和父类(super class),我就可以表达这种关系,而无需太多额外的繁琐操作。你可以这样做:

Object.subclass = function (sub, sup) {
sub.prototype = Object.create(sup.prototype);
sub.prototype.constructor = sub;
}

Object.subclass(Worker, Person); // "class Worker extends Person"

关于javascript - 如何在没有第三个对象垫片的情况下进行继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29283063/

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