Javascript 如何使用ES6类创建不从Object.prototype继承的类?

Javascript 如何使用ES6类创建不从Object.prototype继承的类?,javascript,class,null,prototype,ecmascript-6,Javascript,Class,Null,Prototype,Ecmascript 6,我可以使用较旧的语法创建一个不从Object.prototype继承的类 函数形状(x、y、宽度、高度){ 这个,x=x, 这个。y=y, this.width=宽度, 高度=高度; } Shape.prototype=Object.create(null{ 建造商:{ 对,, 可写:对, 值:形状 }, 移动:{ 对,, 可写:对, 值:函数(x,y){ 这个.x+=x, 这个.y+=y; } } }); var rect=新形状(0,0,4,2); log(Object.getProtot

我可以使用较旧的语法创建一个不从
Object.prototype
继承的类

函数形状(x、y、宽度、高度){
这个,x=x,
这个。y=y,
this.width=宽度,
高度=高度;
}
Shape.prototype=Object.create(null{
建造商:{
对,,
可写:对,
值:形状
},
移动:{
对,,
可写:对,
值:函数(x,y){
这个.x+=x,
这个.y+=y;
}
}
});
var rect=新形状(0,0,4,2);
log(Object.getPrototypeOf(rect)==Shape.prototype);

log(Object.getPrototypeOf(Object.getPrototypeOf(rect))!==Object.prototype)//继承
您必须手动将
Shape.prototype
的prototype设置为
null

类形状{
构造器(x、y、宽度、高度){
这个,x=x,
这个。y=y,
this.width=宽度,
高度=高度;
}
移动(x,y){
这个.x+=x,
这个.y+=y;
}
}
//这是关键线路。
setPrototypeOf(Shape.prototype,null);
const rect=新形状(0,0,4,2);
log(Object.getPrototypeOf(rect)==Shape.prototype);

log(Object.getPrototypeOf(Object.getPrototypeOf(rect))!==Object.prototype)您可以使用
扩展null

注意,类本身仍将从
函数.prototype
继承,而不是从
null
继承。因此,您将能够在类上使用函数方法

但是要注意,当使用
extends
子句时,您必须在使用它之前通过调用
super
初始化
this
,或者不要使用
this
并在末尾返回一个对象

在这种情况下,您不能使用
super
初始化
,因为
函数.prototype
不是构造函数。因此,您必须使用
Object.create
来创建将成为实例的对象

类形状扩展为null{
构造函数(x,y){
//使用'that'而不是'this',并在结尾处返回它
var=Object.create(new.target.prototype);
x=x;
y=y;
归还;
}
移动(x,y){
这个.x+=x;
这个.y+=y;
}
}
var rect=新形状(0,0);
console.log(rect);
log(Object.getPrototypeOf(rect)==Shape.prototype);
console.log(Object.getPrototypeOf(Shape.prototype)==null);

console.log(Object.getPrototypeOf(Shape)==Function.prototype)这很有趣!我不知道你能做到。很好的一点是,这样做的好处是仍然可以使用
函数。
Shape
上的prototype
方法。我了解到,您可以
扩展null
,但无法找出
super()
不起作用的原因。谢谢你的解释。这真的很不可靠…@MichaelTheriot是的,它不起作用,因为
null
不可调用,但它太烦人了。我听说他们正在考虑修理它。