副标题#e#
定义并调用一个常规函数:
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;
}
#p#副标题#e#
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。