gpt4 book ai didi

javascript - 为什么 ES6 类没有被提升?

转载 作者:IT王子 更新时间:2023-10-29 02:57:54 25 4
gpt4 key购买 nike

因为 ES6 类只是 JavaScript 现有的基于原型(prototype)的继承的语法糖 [1]提升它的定义 (IMO) 是有意义的:

var foo = new Foo(1, 2); //this works

function Foo(x, y) {
this.x = x;
this.y = y;
}

但以下内容不起作用:

var foo = new Foo(1, 2); //ReferenceError

class Foo {
constructor(x, y) {
this.x = x;
this.y = y;
}
}

为什么 ES6 类没有提升?

最佳答案

Why are ES6 classes not hoisted?

实际上它们提升了(变量绑定(bind)在整个范围内可用)就像let and const are - 它们只是没有被初始化。

It would make sense to hoist its definition

没有。在定义之前使用类从来都不是一个好主意。考虑这个例子

var foo = new Bar(); // this appears to work
console.log(foo.x) // but doesn't

function Bar(x) {
this.x = x || Bar.defaultX;
}
Bar.defaultX = 0;

比较

var foo = new Bar(); // ReferenceError
console.log(foo.x);

class Bar {
constructor (x = Bar.defaultX) {
this.x = x;
}
}
Bar.defaultX = 0;

如您所料,它会抛出一个错误。这是静态属性、原型(prototype)混合、装饰器和所有东西的问题。这对于子类化也非常重要,当您使用带有未调整原型(prototype)的类时,子类化在 ES5 中完全中断,但现在如果 extended 类尚未初始化,则会抛出错误。

关于javascript - 为什么 ES6 类没有被提升?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35537619/

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