JavaScript中的方法是什么

本文详细介绍了JavaScript中对象的速记方法定义、动态添加方法、类及其方法、以及方法调用、间接函数调用和绑定函数的使用。强调了this关键字在不同上下文中的行为,并指出箭头函数不宜作为方法。

greet() { .... }是在对象定义的方法,这种定义类型称为速记方法定义(从ES2015开始可用)。方法定义的语法也更长:

const world = {

who: ‘World’,

greet: function() {

return Hello, ${this.who}!;

}

}

world.greet(); // => ‘Hello, World!’

greet: function() { ... }是一个方法定义,注意附加的冒号和function关键字。

动态添加方法

方法只是一个函数,它作为属性存储在对象上。 因此,我们可以向对象动态添加方法:

const world = {

who: ‘World’,

greet() {

return Hello, ${this.who}!;

}

};

// A a new property holding a function

world.farewell = function () {

return Good bye, ${this.who}!;

}

world.farewell(); // => ‘Good bye, World!’

3.类方法

在 JavaScript 中,类别语法定义了一个类别,该类别将用作其实例的模板。

类也可以有方法:

class Greeter {

constructor(who) {

this.who = who;

}

greet() { console.log(this === myGreeter); // logs true return Hello, ${this.who}!; }}

const myGreeter = new Greeter(‘World’);

myGreeter.greet(); // => ‘Hello, World!’

greet() { ... }是在类内部定义的方法。

每次我们使用new操作符(例如myGreeter = new Greeter('World'))创建一个类的实例时,都可以在创建的实例上调用方法。

myGreeter.greet()是如何在实例上调用方法greet()的方法。 重要的是方法内部的this等于实例本身:this等于greet() { ... }方法内部的 myGreeter

4.如何调用方法

4.1方法调用

JavaScript 特别有趣的是,在对象或类上定义方法只能算完成工作的一半。为了维护方法的上下文,我们必须确保将方法作为方法调用。

我们来看看为什么它很重要。

回忆一下有greet()方法的world对象。我们测试一下greet()作为一个方法和一个常规函数调用时,this值是什么:

const world = {

who: ‘World’,

greet() {

console.log(this === world); return Hello, ${this.who}!;

}

};

// 方法调用

world.greet(); // logs true

const greetFunc = world.greet;

// 常规函数调用

greetFunc(); // => logs false

world.greet()是一个方法调用。对象world,后面是一个点.,最后是使方法调用的方法本身。

greetFuncworld.greet是同一个函数。但当作为常规函数greetFunc()调用时,这个在greet()中的并不等于world对象,而是全局对象(在浏览器中是window)

我们将诸如greetFunc = world.greet之类的表达式命名为将方法与其对象分离的方法。 调用分离的方法greetFunc()时,this等于全局对象。

将方法与其对象分离可以采用不同的形式:

// 方法分离, this 丢失了!

const myMethodFunc = myObject.myMethod;

// 方法分离, this 丢失了!

setTimeout(myObject.myMethod, 1000);

// 方法分离, this 丢失了!

myButton.addEventListener(‘click’, myObject.myMethod)

// 方法分离, this 丢失了!

My React Button

为了避免丢失方法的上下文,请确保使用方法调用world.greet()或手动将方法绑定到对象greetFunc = world.greet.bind(this)

4.2间接函数调用

如上一节所述,常规函数调用已将this解析为全局对象。 常规函数是否可以通过方法自定义 this值?

欢迎使用以下间接函数调用:

myFunc.call(thisArg, arg1, arg2, …, argN);

myFunc.apply(thisArg, [arg1, arg2, …, argN]);

函数对象上可用的方法。

myFunc.call(thisArg)myFunc.apply(thisArg) 的第一个参数是间接调用的上下文(this值)。 换句话说,我们可以手动指定函数内部 this 的值。

例如,让我们将greet()定义为一个常规函数,以及一个具有who属性的对象alien:

function greet() {

return Hello, ${this.who}!;

}

const aliens = {

who: ‘Aliens’

};

greet.call(aliens); // => ‘Hello, Aliens!’

greet.apply(aliens); // => ‘Hello, Aliens!’

greet.call(aliens)greet.apply(aliens)都是间接的方法调用。这个在greet()函数中的值等于aliens对象。

4.3 绑定函数调用

最后,还有一种在对象上使函数作为方法调用的第三种方法。 我们可以将函数绑定为具有特定上下文。

可以使用特殊方法创建绑定函数

const myBoundFunc = myFunc.bind(thisArg, arg1, arg2, …, argN);

myFunc.bind(thisArg)的第一个参数是函数要绑定到的上下文。

例如,让我们重用greet()并将其绑定到aliens上下文

function greet() {

return Hello, ${this.who}!;

}

const aliens = {

who: ‘Aliens’

};

const greetAliens = greet.bind(aliens);

greetAliens(); // => ‘Hello, Aliens!’

调用 greet.bind(aliens) 会创建一个新函数,该函数将 this 绑定到aliens对象。

同样,使用绑定函数可以模拟方法调用。当调用绑定函数greetAliens()时,this等于该函数中的 aliens

5. 箭头函数作为方法

不推荐使用箭头函数作为方法,原因如下。

我们将greet()方法定义为一个箭头函数:

const world = {

who: ‘World’,

greet: () => {

return Hello, ${this.who}!;

}

};

world.greet(); // => ‘Hello, undefined!’

不幸的是,world.greet()返回'Hello, undefined!而不是我们期待的'Hello, World!'

问题是箭头函数内部的this等于外部作用域的this。 但是,此时,我们想要的thisworld对象。

上述箭头功能内部 this 等于全局对象:window'Hello, ${this.who}!' 结果是 Hello, ${windows.who}!,最后是 'Hello, undefined!'

我喜欢箭头功能, 但是它们不能用作方法。

6. 总结

该方法是一个属于对象的函数。方法的上下文(this)等于该方法所属的对象。

还可以在类上定义方法。这个类的方法内部等于实例。 JS 特有的一点是,仅仅定义一个方法是不够的。我们还需要确保使用方法调用。通常,方法调用具有以下语法

// Method invocation

myObject.myMethod(‘Arg 1’, ‘Arg 2’);

有趣的是,在 JS 中,我们可以定义一个常规函数,但不属于一个对象,然后作为一个任意对象的方法调用该函数。可以使用间接函数调用或将函数绑定到特定上下文来实现这一点

// Indirect function invocation

myRegularFunc.call(myObject, ‘Arg 1’, ‘Arg 2’);

myRegularFunc.apply(myObject, ‘Arg 1’, ‘Arg 2’);

// Bound function

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

最后

今天的文章可谓是积蓄了我这几年来的应聘和面试经历总结出来的经验,干货满满呀!如果你能够一直坚持看到这儿,那么首先我还是十分佩服你的毅力的。不过光是看完而不去付出行动,或者直接进入你的收藏夹里吃灰,那么我写这篇文章就没多大意义了。所以看完之后,还是多多行动起来吧!

可以非常负责地说,如果你能够坚持把我上面列举的内容都一个不拉地看完并且全部消化为自己的知识的话,那么你就至少已经达到了中级开发工程师以上的水平,进入大厂技术这块是基本没有什么问题的了。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

并且后续会持续更新**

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-tPVKjOAI-1712832668915)]

最后

今天的文章可谓是积蓄了我这几年来的应聘和面试经历总结出来的经验,干货满满呀!如果你能够一直坚持看到这儿,那么首先我还是十分佩服你的毅力的。不过光是看完而不去付出行动,或者直接进入你的收藏夹里吃灰,那么我写这篇文章就没多大意义了。所以看完之后,还是多多行动起来吧!

可以非常负责地说,如果你能够坚持把我上面列举的内容都一个不拉地看完并且全部消化为自己的知识的话,那么你就至少已经达到了中级开发工程师以上的水平,进入大厂技术这块是基本没有什么问题的了。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-E099pHPG-1712832668916)]

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值