猫史档案馆


【JS教程】如何不用()括号和call()就可以调用函数!前提要没有参数

用户:蓝矮爱乐蓝矮爱乐查看:3 回复:2 评论:3 创建时间:2022-06-28T08:40:28


很多代码师认为

不加括号或call()就调用函数

是不可能的一件事

深深了解对象的人,都知道getter方法

但,深深了解对象的人以为getter只能用在前面是一个对象的地方,且不能定义(setter也一样)

那,就大错特错了

先让我们知道getter和setter是什么东东吧

首先,setter和getter必须用在对象后面才行,可对?

在定义一个变量,数据为对象类型的时候,就能用getter和setter

getter和setter要用到关键词分别是“get”和“set”

这便是平常不会用到的关键词(除了entity.position.set)

那么,究竟怎么用?请看实例

const obj = {
    name:'obj',
    get clearWorldChat(){//getter不能有参数存在
        for(this.e=0;e<=300;e+=1){
            world.say('')
        }
    }
    /**
    @param{string}pl
*/ //setter要声明参数的类型
    set kickPlayer(pl){
        for(const e of world.querySelectorAll('player')){
            if(e.player.name==pl){
                e.player.kick()
            }
        }
    }//setter必须要有参数,且只能有一个
}

像上面的例子,有一个getter获取属性方法与setter执行属性方法

那么,这样的属性要怎么用?

请看用法:

obj.clearWorldChat;//不用加圆括号,就可以直接将地图的聊天去清空!
obj.kickPlayer='蓝矮爱乐';//赋值方法,将得到的值带入参数"pl",然后执行函数,踢出蓝矮爱乐这个玩家

现在知道getter和setter大致意思了吧

那么问题来了:如果没有在这里面定义setter或getter想要后来去定义,怎么做?

这个问得好!帖主今天才刚刚学会的方法

那么,请看方法!

obj.__proto__.__defineGetter__('ed',()=>{
    const e =world.querySelectorAll('player');
    return e[Math.floor(Math.random()*e.length)]//getter不用加圆括号就能返回值
    //这个代码执行效果就是获取地图的随机玩家
})//在后来的时候定义一个getter
//在后来定义setter的格式仍然一样
对象名.__proto__.__defineSetter__('要定义的setter名字',(参数)=>会执行的函数)

(这样应该学会如何用getter和setter和后来定义setter和getter了吧)

那么,前面不想用对象名,直接用变量名呢?

没错,globalThis是一个好东西,在globalThis里面定义getter和setter就行了

那么,怎么在globalThis里面定义getter和setter呢?知道的可以回复一下


回复

上一页1 页 / 共 1下一页
yee剑走天下yee剑走天下

sofa()

点赞1


评论


爱探险的可乐呀爱探险的可乐呀

// 如果想在对象外面来定义getter或setter,就是楼主说的“后来去定义”,可以直接这样写

let obj = {};

obj.__defineGetter__('testGetter', () => {
    // ...
});

obj.__defineSetter__('testSetter', param => {
    // ...
});

// 而不用写__proto__,那样的写喵繁琐一点

点赞0


评论