gpt4 book ai didi

javascript - 派生类究竟从其基类继承了什么?

转载 作者:行者123 更新时间:2023-12-03 13:10:39 26 4
gpt4 key购买 nike

我目前正在学习 JavaScript 的 ES6 类,我似乎理解它们的概念,但我不明白派生类从其基类继承了什么。是类的方法吗?假设一个类的方法是该类的属性是否安全?在这种情况下,它们是原型(prototype)的一部分,因此被原型(prototype)链中的对象继承。那么构造函数呢?构造函数内部定义的属性是否继承?

谢谢您的考虑!

最佳答案

类或多或少只是用于设置原型(prototype)继承的语法糖。

class Derived extends Base {}

相当于
function Derived(...args) {
return Base.apply(this, args);
}

Object.setPrototypeOf(Derived, Base);
Object.setPrototypeOf(Derived.prototype, Base.prototype);
super 有一些“魔法”。而且以后有public和private的类字段,但是对象之间的基本关系是一样的。

Is it safe to assume that the methods of a class are properties of said class? In which case, they are part of the prototype and are thus inherited by objects down the prototype chain.



是的,方法成为相应 prototype 的属性对象,所有实例都从该对象继承。 IE。
class Foo {
bar() {}
}

相当于
function Foo() {}
Foo.prototype.bar = function() {}

由于“基类” property对象在派生类的原型(prototype)链中,其所有方法都可用于派生类的实例。

Are properties defined inside the constructor inherited?



“继承”在这里是错误的词。属性是在实例本身上创建的,因为这就是构造函数的工作方式。

考虑这个过程是这样的:
// Create new instance
var newInstance = Object.create(Derived.prototype);

// Call base constructor with `this` set to new instance
Base.apply(newInstance);

// Call derived constructor with `this` set to new instance
Derived.apply(newInstance);

如果基础构造函数包含类似 this.base = 42; 的内容,则该属性将直接在新实例上创建,因为 this指的是新实例。

注:实际上,由于扩展了内置类(例如 Array),因此确切的流程有点不同。需要特殊处理,但最终结果大致相同。

你没有问 static方法,但这些仍然是继承的一部分。 static方法成为构造函数本身的属性。
class Foo {
static bar() {}
}

相当于
function Foo() {}
Foo.bar = function() {}

因为基类的构造函数成为派生类构造函数的原型(prototype),所以在基构造函数上定义的所有属性对派生构造函数都是可用的。

您浏览器中的开发人员工具实际上可以向您展示所有这些:

class Base {

static staticBase() {}

constructor() {
this.base = 42;
}

fromBase() {}
}

class Derived extends Base {

static staticDervied() {}

constructor() {
super(); // necessary since we extend base
this.derived = 21;
}

fromDerived() {}
}

console.dir(Derived);
console.dir(new Derived());


enter image description here

关于javascript - 派生类究竟从其基类继承了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59794094/

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