Javascript 如何使用原型创建类而不使用;新";及;这";

Javascript 如何使用原型创建类而不使用;新";及;这";,javascript,class,this,prototype,new-operator,Javascript,Class,This,Prototype,New Operator,我试图理解当我们在ES6中使用“classes”时,在所有语法糖下发生了什么,以及当我们使用“new”和“this”关键字时发生了什么。我知道JavaScript是一种基于原型的编程语言,我在下面给出了一些代码,可以在不使用“new”或“this”的情况下实现这一点 //构造函数将3个自定义属性传递给预定对象,然后返回该对象。 函数构造函数测试函数(值1、值2、值3、对象){ object.property1=value1; object.property2=value2; object.pr

我试图理解当我们在ES6中使用“classes”时,在所有语法糖下发生了什么,以及当我们使用“new”和“this”关键字时发生了什么。我知道JavaScript是一种基于原型的编程语言,我在下面给出了一些代码,可以在不使用“new”或“this”的情况下实现这一点

//构造函数将3个自定义属性传递给预定对象,然后返回该对象。
函数构造函数测试函数(值1、值2、值3、对象){
object.property1=value1;
object.property2=value2;
object.property3=value3;
返回对象;
}
/*因为我没有使用“this”,所以我将“constructorestfunction.prototype”对象包装成了一个函数
称为“ConstructorTestFunctionPrototype”。这将允许我将父对象的属性传递到
对象“.prototype”属性中的方法*/
函数构造函数TestFunctionPrototype(对象){
ConstructorTestFunction.prototype={
addValues(){
返回object.property1+object.property2+object.property3;
},
最小值(){
返回object.property1-object.property2-object.property3;
},
多值(){
返回object.property1*object.property2*object.property3;
},
divideValues(){
返回object.property1/object.property2/object.property3;
}
};
返回ConstructorTestFunction.prototype
};
//因为我没有使用“new”,所以我将_object1设置为一个带有[[prototype]]=object.prototype的空白javascript对象
const_object1={};
/*使用对象的父对象将_object1的[[prototype]]更改为“ConstructorTestFunction.prototype”
传递到它的隐藏[[prototype]]属性中*/
_object1.\uuuu proto\uuuu=constructorestfunctionprototype(\u object1);
/*创建object1,它是ConstructorTestFunction的实例。它传入作为对象的“_object1”
使用“[[prototype]]=ConstructorTestFunctionPrototype(_object1)”,因此它继承了
“ConstructorTestFunction.prototype”,同时引用父对象的属性。它也传入
类中包含的所有指定特性的值。
*/
const object1=constructorestfunction(40,50,245,_object1);
//因为我没有使用“new”,所以我将_object2设置为一个带有[[prototype]]=object.prototype的空白javascript对象
const_object2={};
/*使用对象的父对象将_object2的[[prototype]]更改为“constructorestfunction.prototype”
传递到它的隐藏[[prototype]]属性中*/
_object2.\uuuuu proto\uuuuu=ConstructorTestFunctionPrototype(\uObject2);
/*创建object2,它是ConstructorTestFunction的实例。它传入作为对象的“_object2”
使用“[[prototype]]=ConstructorTestFunctionPrototype(_object2)”,因此它继承了
“ConstructorTestFunction.prototype”,同时引用父对象的属性。它也传入
类中包含的所有指定特性的值。
*/

const object2=constructorestfunction(1,2,3,_object2)
每次调用
ConstructorTestFunctionPrototype
都会生成一组新的方法(
addValues
等)。这首先消除了使用原型的性能/内存优势

您可以注意到,如果运行代码,
object1.addValues!==object2.添加值
。而传统的代码要求它们是
=
,在
上使用多态性来操作正确的对象

在JavaScript中使用常用的类/原型系统的好处正是在类的所有实例之间共享方法的内存和优化优势。作为交换,您需要使用
this
找到方法的目标,而不是像这里所做的那样将其绑定到特定的单个对象


正如@Pointy在他对OP的评论中所指出的,语言可以做一些在运行时不能做的事情。在这种情况下,语言中内置的魔法是
x.y(z)
的翻译,使得
y
被调用为
x
作为


您可以使用一个非特殊参数“模拟”
这个
,但这样您就失去了良好的语法。例如,您可以编写
y(x,z)
,然后使用第一个参数代替
y的定义,而不是使用
this
。但是,如果您想在
之前访问该对象,则需要使用
this

每次调用
ConstructorTestFunctionPrototype
都会生成一组新的方法(
addValues
等)。这首先消除了使用原型的性能/内存优势

您可以注意到,如果运行代码,
object1.addValues!==object2.添加值
。而传统的代码要求它们是
=
,在
上使用多态性来操作正确的对象

在JavaScript中使用常用的类/原型系统的好处正是在类的所有实例之间共享方法的内存和优化优势。作为交换,您需要使用
this
找到方法的目标,而不是像这里所做的那样将其绑定到特定的单个对象


正如@Pointy在他对OP的评论中所指出的,语言可以做一些在运行时不能做的事情。在这种情况下,语言中内置的魔法是
x.y(z)
的翻译,使得
y
被调用为
x
作为

您可以使用一个非特殊参数“模拟”
这个
,但这样您就失去了良好的语法。例如,您可以编写
y(x,z)
,然后使用第一个参数代替
y的定义,而不是使用
this
。但是如果你想得到那东西