Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript es6课程真的是语义糖吗?_Javascript_Ecmascript 6_Es6 Class - Fatal编程技术网

Javascript es6课程真的是语义糖吗?

Javascript es6课程真的是语义糖吗?,javascript,ecmascript-6,es6-class,Javascript,Ecmascript 6,Es6 Class,如果它们只是语义糖,我如何在es5中获得与以下es6脚本相同的结果 class MyFunc extends Function{} new MyFunc('alert("hi guys")')() 及 它是糖,因为它在背景中做了你们可以用原型做的事情 这里有所有的解释: 附言:糖对我来说并不意味着坏,它显然更容易阅读,但有些人不喜欢 对于阵列,您可以执行以下操作: let arr = new Array(1,2,3,4); arr[2] = "a value"; arr.push("an o

如果它们只是语义糖,我如何在es5中获得与以下es6脚本相同的结果

class MyFunc extends Function{}
new MyFunc('alert("hi guys")')()


它是糖,因为它在背景中做了你们可以用原型做的事情

这里有所有的解释:

附言:糖对我来说并不意味着坏,它显然更容易阅读,但有些人不喜欢

对于阵列,您可以执行以下操作:

let arr = new Array(1,2,3,4);
arr[2] = "a value";
arr.push("an other value");
没有

&我不得不说人们并不清楚JS。 在es6中“扩展”时,不会创建独立类型。。这就是糖在你心里犯的错误

请尝试以下代码:

class MyArr extends Array{}
let myarr = new MyArr(1,2,3,4);
myarr[2] = "a value";
myarr.push("an other value");
console.log("ah");

Array.prototype.push = function () {
  console.log('NAH');
}

let a = [];
a.push("an other value");
myarr.push("an other value");
如果您更改数组原型方法,您也将在扩展类中通过引用来更改它。

不,它们主要是语法上的糖。他们可以做ES5中类模式所做的所有事情,但还不止这些


关于对象如何实例化的细节,特别是在子类中,已经过彻底的修改,现在允许对内置函数进行子类化,如
函数
数组
。这在ES5中是不可能的。有关详细信息,请查看和。

我不确定es5,但可以不使用
语法而使用其他es6功能来模拟es6类

比如说你的例子,

class MyFunc extends Function{}
new MyFunc('alert("hi guys")')()
可以使用旧式类和
Reflect进行模拟

function MyFunc(...args) {return Reflect.construct(Function, args, new.target);}
new MyFunc('alert("hi guys")')()
Reflect.construct
实现了真正的子类构造函数中的
super()
调用所能实现的功能,这就是发布的示例所需的全部功能。如果希望正确继承所有属性和静态方法,则需要像这样额外设置原型

function MyFunc(...args) {return Reflect.construct(Function, args, new.target);}
Object.setPrototypeOf(MyFunc, Function);
Object.setPrototypeOf(MyFunc.prototype, Function.prototype);
new MyFunc('alert("hi guys")')()
这也适用于数组示例

function MyArr(...args) {return Reflect.construct(Array, args, new.target);}
Object.setPrototypeOf(MyArr, Array);
Object.setPrototypeOf(MyArr.prototype, Array.prototype);
var myarr = new MyArr(1,2,3,4)
myarr[2] = "a value"
myarr.push("an other value")
第一个set-prototype调用只需要继承静态属性,如
Array.from
。如果您不关心这些,那么只需设置prototype对象的原型就可以了,在这种情况下,您根本不需要
object.setPrototypeOf
。您可以改为使用
对象。按如下方式创建

function MyArr(...args) {return Reflect.construct(Array, args, new.target);}
MyArr.prototype = Object.create(Array.prototype);
MyArr.prototype.constructor = MyArr;
var myarr = new MyArr(1,2,3,4)
myarr[2] = "a value"
myarr.push("an other value")

有关更多详细信息,请选择“是”和“否”。您不能像在ES6中那样扩展ES5中的阵列。这实际上与
class
语法无关,而是与在ES6中使数组对象可子类化有关(其神奇的
.length
属性在ES5中导致子类化问题)。但是,您可以在ES5中扩展其他普通对象,而无需使用
语法。早在
语法出现之前,我们就在ES5中很好地使用了完全继承。编写ES5声明并没有那么漂亮,但一旦声明,效果也一样。不确定这是否应该作为的副本关闭,因为它没有合适的答案,也没有提到您的具体案例。而且,OP展示了一个扩展
Array
的示例,在ES5中,由于ES5不允许继承的神奇
.length
属性,您不能特别扩展它。尽管我没有否决您的意见,但我只想说,您不明白糖在这种情况下的含义,什么?我真的不明白你的意思@jfriend00我编辑了我的示例来展示ES5HUHH。你的答案里根本没有密码。我很高兴您能向我们展示如何在ES5中继承
数组
。@nodeover您真的不能指责jfriend不理解JS。他是这个话题的第五大回答者,所以:-)你把我搞糊涂了:“他们可以做ES5课程模式所做的所有事情”。ES5中的类模式是什么?@jfriend00人们通常称之为“类”,即构造函数与其原型对象上的方法的组合。他的意思是,你永远都有可能做到这一点。他在这里解释道:经过多年的研究,人们真的不理解这种语言。有关更多信息,请查看“You not know js”程序类->我只是认为ES5中的
类模式与ES6中的
class
关键字进行对比时,用词不当。我可能会建议更具描述性,比如ES5中手动定义构造函数和原型的
方法
@jfriend00,我明白了,但我想这是故意的:它们比人们在语法上想象的更相似,两种方法创建的对象结构基本相同。这个结构就是我所说的“类”,而不是创建它的代码部分。事实上,你不能忽略newtarget参数来复制
super()
所做的,否则
Reflect.construct
newparentconstructor(…args)
没有什么不同。如果(!new.target)抛出新的TypeError(…)
@Bergi,您可能还应该包含一个
,好的,我更改了代码以减少混淆,我完全同意。我相信,如果你手头有
.setPrototypeOf()
甚至
\uuuuuuuuuuuuuuu
的话,类就完全是语法上的糖。您可以在不使用类的情况下进行各种子类化。
function MyArr(...args) {return Reflect.construct(Array, args, new.target);}
MyArr.prototype = Object.create(Array.prototype);
MyArr.prototype.constructor = MyArr;
var myarr = new MyArr(1,2,3,4)
myarr[2] = "a value"
myarr.push("an other value")