1.什么是方法
定义并调用一个常规函数:
- function greet(who) {
- return `Hello, ${who}!`;
- }
- greet('World'); // => 'Hello, World!'
function关键字后跟其名称,参数和主体:function greet(who){…}进行常规的函数定义。
greet('World')是常规的函数调用。函数greet('World')接受参数中的数据。
如果who是一个对象的属性呢?要方便访问对象的属性,我们可以将函数附加到该对象,换句话说,就是创建一个方法。
我们将greet()作为对象world的一种方法:
- const world = {
- who: 'World',
- greet() { return `Hello, ${this.who}!`; }}
- world.greet(); // => 'Hello, World!'
greet() { … }现在是属于world对象的方法, world.greet()是方法调用。
在greet()方法内部,this指向该方法所属的对象—world,这就是为啥可以this.who访问 word属性的原因。
注意,this也称为上下文。
上下文是可选的
在上一个示例中,我们使用this来访问该方法所属的对象,但是 JS 没有强制让方法使用 this。
因此,可以将对象用作方法的命名空间:
- const namespace = {
- greet(who) {
- return `Hello, ${who}!`;
- },
- farewell(who) {
- return `Good bye, ${who}!`;
- }
- }
- namespace.greet('World'); // => 'Hello, World!'
- namespace.farewell('World'); // => 'Good bye, World!'
namespace是一个包含2个方法的对象:namespace.greet()和namespace.farewell()。
2. 对象字面量方法
如前所述,我们可以直接在对象字面量中定义方法
- const world = {
- who: 'World',
- greet() { return `Hello, ${this.who}!`; }};
- world.greet(); // => 'Hello, World!'
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。