Javascript es6课程真的是语义糖吗?
如果它们只是语义糖,我如何在es5中获得与以下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
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")