Javascript 现有对象中的新ES6类实例
在JavaScript中是否可以创建一个新的ES6类实例,该实例可以访问构造函数中现有对象的属性 我有ES5课程: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
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)
将影响一切,因为所有旧实例现在都将链接到新的原型链。