Javascript 扩展`Object时使用`super()``

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

我正在创建一个类,该类扩展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);//未定义
您缺少

类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
    相同的工作,但不能添加扩展方法。