Javascript 现有对象中的新ES6类实例

Javascript 现有对象中的新ES6类实例,javascript,Javascript,在JavaScript中是否可以创建一个新的ES6类实例,该实例可以访问构造函数中现有对象的属性 我有ES5课程: function ES5() { this.value = 123; } 我需要能够创建一个ES6类实例: class ES6 { constructor() { console.log(this.value); /* must print 123 */ } } 可以从构造函数中访问ES5类属性 基本上,我想要的是: Object.cre

在JavaScript中是否可以创建一个新的ES6类实例,该实例可以访问构造函数中现有对象的属性

我有ES5课程:

function ES5() {
    this.value = 123;
}
我需要能够创建一个ES6类实例:

class ES6 {
    constructor() {
        console.log(this.value); /* must print 123 */
    }
}
可以从构造函数中访问ES5类属性

基本上,我想要的是:

Object.create(ES6.prototype, new ES5());
虽然我知道这个代码不起作用。但是有没有办法让这种逻辑起作用呢


我有一个库,它接受一个用于创建新对象的函数,我还添加了一种方法来检查它是否是ES6类,并使用
new
操作数对其进行不同的初始化,同时为该类提供我自己的现有对象

注意:这也意味着类
ES6
不知道
ES5
类的存在,只知道它的属性。或者换句话说,类
ES6
需要自动获取属性
value
,它无法修补自身

更多详细信息


我的库在内部执行
newES5()
,而类
ES6
在客户端声明。所以它们是独立共存的。当客户机在
ES6
类中传递给我时,我需要实例化它,使其认为它扩展了类
ES5
,即可以访问额外的属性

function createClass(func) {
  if(/* func is an ES6 class*/) {
      var a = new ES5();
      return /* new ES6 instance that has access to ES5 object properties */
  } else {
      return new ES5();
  }
}

您可以将类的原型设置为ES5实例。这将把实例和ES5功能放在原型链中:

函数ES5(){
该值=123;
}
ES6级{
构造函数(){
console.log(this.value);/*必须打印123*/
}
}
设e5=新ES5()
Object.setPrototypeOf(ES6.prototype,e5)
设e6=新ES6
//ES5现在处于e6的原型链中
log(“ES5实例:”,ES5的e6实例)
log(“ES6实例:”,ES6的e6实例)
//它们由原型链接(不确定这对您的使用是好是坏):
console.log(“es6值:”,e6.value)
e5.value=“newValue”
console.log(“es6值:”,e6.value)

如果它对
ES5
一无所知,它怎么能
newES5()
?如何建立
ES5
ES6
之间的关系?我的库在内部执行
newES5()
,而类
ES6
在客户端声明。所以它们是独立共存的。当客户在
ES6
类中通过我时,我需要实例化它,使它认为它扩展了类
ES5
。但是你必须告诉
ES6
它应该以某种方式扩展哪个类。你的示例不完整,它只会让事情变得比以前更糟、更模糊。这太棒了,谢谢!为了完整起见,我还将包括较旧的答案,如易卜拉欣目前的答案,以涵盖所有场景;)@然而,vitaly-t只是一个注意事项,这改变了ES6类本身。此类的任何未来实例都将受到影响。任何未来的突变都会影响所有以前的实例。给出如何定义
createClass
,我想这会导致其他问题。我甚至不知道这是否糟糕,因为我仍然不明白您在寻找什么。@ibrahimmahrir是的,这是一种折衷,这意味着在创建任何新的
ES6
实例之前,我需要调用
setPrototypeOf
,但它仍然可用;)b、 t.w.我也喜欢你的答案,但我不能同时接受这两个答案:)@vitaly-t你是否只希望将
ES5
类的实例传递给
createClass
?否则,这将导致严重的问题,如实例具有不使用的属性(假设您使用另一个EcmaScript 5类的实例调用
createClass
,该EcmaScript 5类不具有
value
属性。在将类
ES5
传递给它之后,新的
ES6
实例仍将具有上一个实例的
value
属性)。可以吗?@ibrahimmahrir是正确的,这可能是不可靠的。一旦创建了ES6实例,如果更改了ES6类的原型,过去的实例将反映此更改。因此运行
Object.setPrototypeOf(ES6.prototype,someotherinstance)
将影响一切,因为所有旧实例现在都将链接到新的原型链。