Javascript 扩展`Object时使用`super()``
我正在创建一个类,该类扩展JavaScript中的Javascript 扩展`Object时使用`super()``,javascript,ecmascript-6,Javascript,Ecmascript 6,我正在创建一个类,该类扩展JavaScript中的Object,并期望super()在构造该类的新实例时初始化键/值 类ExtObject扩展对象{ 构造函数(…参数){ 超级(…args); } } const obj=新对象({foo:'bar'}); console.log(obj);//{foo:'bar'} const ext=新的外部对象({foo:'bar}); console.log(ext);//外部对象{} console.log(ext.foo);//未定义您缺少 类E
Object
,并期望super()
在构造该类的新实例时初始化键/值
类ExtObject扩展对象{
构造函数(…参数){
超级(…args);
}
}
const obj=新对象({foo:'bar'});
console.log(obj);//{foo:'bar'}
const ext=新的外部对象({foo:'bar});
console.log(ext);//外部对象{}
console.log(ext.foo);//未定义
您缺少
类ExtObject扩展对象{
构造函数(…参数){
超级(…args);
分配(此,…args);
}
}
const obj=新对象({foo:'bar'});
console.log(obj);//{foo:'bar'}
const ext=新的外部对象({foo:'bar});
console.log(ext);//{foo:'bar'}
console.log(ext.foo);//bar
此答案仅在使用巴贝尔transpiler时有效
因为对象的构造函数返回值。看
15.2.2.1新对象([值])调用对象构造函数时,如果没有参数或只有一个参数值,则会执行以下步骤:
...
8. 返回对象。
类ExtObject扩展对象{
构造函数(…参数){
返回super(…args);
}
}
const obj=新对象({foo:'bar'});
console.log(obj);//{foo:'bar'}
const ext=新的外部对象({foo:'bar});
console.log(ext);//{foo:'bar'}
console.log(ext.foo);//没有人真正解释过它为什么不起作用。如果我们看一下,对象
函数的定义如下:
19.1.1.1对象([值])
当使用可选参数value
调用Object
函数时,将执行以下步骤:
如果NewTarget
既不是未定义的
也不是激活的函数,则
返回<代码>OrdinaryCreateFromConstructor(新目标,“%ObjectPrototype%”)
value
为null
,未定义
或未提供,则返回ObjectCreate(%ObjectPrototype%)
NewTarget
指调用new
的函数。因此,如果您创建新对象
,它将是对象
。如果调用new-ExtObject
,它将ExtObject
因为ExtObject
不是对象
(“也不是活动函数”),所以条件匹配并计算OrdinaryCreateFromConstructor
,并返回其结果。如您所见,传递给函数的值没有任何作用
值
仅在两个值均为1时使用。也不是2。这些都实现了。如果value
是一个对象,它只按原样返回,不创建新对象。因此,新对象(objectValue)
实际上与对象(objectValue)
相同:
var foo={bar:42};
log(新对象(foo)==foo);
console.log(对象(foo)==foo)代码>虽然我无法回答您的问题,但我不禁想知道您为什么要扩展对象
。因为我希望扩展类的实例与对象的行为相同,并且具有自定义功能。我明白你的意思,因为我想如果不扩展Object
并在构造函数中使用Object.assign()
,也可以创建相同的功能,正如Gildas.Tambo建议的那样。但这真的让我想知道为什么它不是这样工作的。关于这个问题,有趣的是巴贝尔可以传输这个代码来给出正确的结果。问题就是问题。没有理由说它应该包含指向答案的链接。您可以通过接受答案将答案固定到顶部,但仅此而已。虽然这是可行的,但在这种情况下,我们不需要扩展对象
和超级()
,对吗?我想这更像是“复制”父(对象)构造函数方法的源?是的,因为我们正在处理对象,所以请尝试理解ECMAScript 6类和继承以及Super@TimBaas的超类调用,我对此ans表示怀疑。。。。假设您删除扩展对象
和超级(…args)
,一切都很好。。。它只是在复制值。@barbsan这不是一个有效的答案,您正在使用babel来传输代码,这就是它工作的原因,在本机支持ES6的浏览器中,这将不起作用work@Caramiriel这是因为您在构造函数中返回一个新对象:{foo:'bar}
。在barbsan的回答中,返回了super()
,它不是一个新对象,而是这个类的一个新实例。@Caramiriel因为我在snippet的SettingsCreate中选择了Babel transpiler,所以终于明白了为什么使用object.create()
只能做与object
相同的工作,但不能添加扩展方法。