我的代码如下:

class myClass
{
    constructor()
    {
        this.memberVar1="";
        this.memberVar2="";
    }

    memberFunction1()
    {
        // memberFunction1 code
    }
}

var myObj = {
    objVar1 : someJsonObject,
    objVar2 : new myClass()
}

而不是调用成员函数和成员Var1,而是类似于

myObj.objVar2.memberVar1;
myObj.objVar2.memberFunction1();

我希望这样称呼他们:

myObj.memberVar1;
myObj.memberFunction1();

我有什么办法可以重组myObj来实现这一点吗?

Thanks in advance

推荐答案

函数是Java脚本中的第一类对象,而Java类的成员只是一个对象,所以没有什么可以阻止您将myObj.memberFunction1设置为您喜欢的任何引用,包括someJsonObject.memberFunction1,但是您需要知道,this的行为将根据您设置引用的方式而有所不同.这对于使您的memberFunction根据上下文正确运行可能很重要.

class myClass
{
    constructor()
    {
        this.memberVar1="";
        this.memberVar2="";
    }

    memberFunction1()
    {
        // memberFunction1 code
    }
}

let someJsonObject = {
    memberFunction1: function(source) {
        if (this === myObj) { console.log(`${source}: "this" is myObj`) }
        else if (this === someJsonObject) { console.log(`${source}: "this" is someJsonObject`) }
        else { console.log('JavaScript interpreter is insane') }
    }
}

var myObj = {
    objVar1 : someJsonObject,
    objVar2 : new myClass(),
    memberFunction1: someJsonObject.memberFunction1 // the assignment will cause "this" to point to myObj

}


console.log('==== setting the reference (changes this) ====')
myObj.memberFunction1('myObj')
someJsonObject.memberFunction1('someJsonObject')
myObj.objVar1.memberFunction1('myObj.objVar1') // myObj.objVar1 is === someJsonObject
myObj.keepThis = myObj.memberFunction1 // You can hang onto the "myObj" referenced version of the function if you want
console.log('==== binding to someJsonObject ====')
myObj.memberFunction1 = myObj.memberFunction1.bind(someJsonObject) // using bind will make "this" point to whatever you like (i.e someJsonObject)
myObj.memberFunction1('myObj')
someJsonObject.memberFunction1('someJsonObject')
myObj.objVar1.memberFunction1('myObj.objVar1')
myObj.keepThis('myObj.keepThis')

Javascript相关问答推荐

访客柜台的风格React.js

RxJS setTimeout操作符等效

有条件的悲剧

传递一个大对象以在Express布局中呈现

了解Node.js中的EventEums和浏览器中的addEventEums之间的关系

为什么promise对js中的错误有一个奇怪的优先级?

Google maps API通过API返回ZERO_RESULTS,以获得方向请求,但适用于Google maps

jQuery s data()[storage object]在vanilla JavaScript中?'

如何避免页面第一次加载时由于CSS样式通过JavaScript更改而出现闪烁

使用原型判断对象是否为类的实例

有条件重定向到移动子域

在画布中调整边上反弹框的大小失败

SPAN不会在点击时关闭模式,尽管它们可以发送日志(log)等

expo 联系人:如果联系人的状态被拒绝,则请求访问联系人的权限

无法读取未定义的属性(正在读取合并)-react RTK

如何用javascript更改元素的宽度和高度?

React:防止useContext重新渲染整个应用程序或在组件之间共享数据而不重新渲染所有组件

JavaScript -复制到剪贴板在Windows计算机上无效

如何在Jest中模拟函数

如何使用fltter_js将对象作为参数传递给javascrip?