方法的定义

方法的定义

尝试一下

const obj = {

foo() {

return "bar";

},

};

console.log(obj.foo());

// Expected output: "bar"

语法

var obj = {

property( parameters… ) {},

*generator( parameters… ) {},

async property( parameters… ) {},

async* generator( parameters… ) {},

// with computed keys:

[property]( parameters… ) {},

*[generator]( parameters… ) {},

async [property]( parameters… ) {},

// compare getter/setter syntax:

get property() {},

set property(value) {}

};

描述

该简写语法与 ECMAScript 2015 的getter和setter语法类似。

如下代码:

jsvar obj = {

foo: function () {

/* code */

},

bar: function () {

/* code */

},

};

现可被简写为:

jsvar obj = {

foo() {

/* code */

},

bar() {

/* code */

},

};

备注:简写语法使用具名函数而不是匿名函数(如…foo: function() {}…)。具名函数可以从函数体调用(这对匿名函数是不可能的,因为没有标识符可以引用)。详细信息,请参阅function。

生成器方法

生成器方法也可以用这种简写语法定义。使用它们时,

简写语法中的星号(*)必须出现在生成器名前,也就是说* g(){}可以正常工作,而g *(){}不行。

非生成器方法定义可能不包含yield关键字。这意味着遗留的生成器函数也不会工作,并且将抛出 SyntaxError。始终使用yield与星号(*)结合使用。

js// 用有属性名的语法定义方法(ES6 之前):

var obj2 = {

g: function* () {

var index = 0;

while (true) yield index++;

},

};

// 同一个方法,简写语法:

var obj2 = {

*g() {

var index = 0;

while (true) yield index++;

},

};

var it = obj2.g();

console.log(it.next().value); // 0

console.log(it.next().value); // 1

Async 方法

Async 方法也可以使用简写语法来定义。

js// 用有属性名的语法定义方法(ES6 之前):

var obj3 = {

f: async function () {

await some_promise;

},

};

// 同一个方法,简写语法:

var obj3 = {

async f() {

await some_promise;

},

};

Async 生成器方法

生成器方法也能成为 async.

jsvar obj4 = {

f: async function* () {

yield 1;

yield 2;

yield 3;

},

};

// The same object using shorthand syntax

var obj4 = {

async *f() {

yield 1;

yield 2;

yield 3;

},

};

方法定义不是构造函数

所有方法定义不是构造函数,如果你尝试实例化它们,将抛出TypeError。

jsvar obj = {

method() {},

};

new obj.method(); // TypeError: obj.method is not a constructor

var obj = {

*g() {},

};

new obj.g(); // TypeError: obj.g is not a constructor (changed in ES2016)

示例

简单示例

jsvar obj = {

a: "foo",

b() {

return this.a;

},

};

console.log(obj.b()); // "foo"

计算的属性名

该简写语法还支持计算的属性名称作为方法名。

jsvar bar = {

foo0: function () {

return 0;

},

foo1() {

return 1;

},

["foo" + 2]() {

return 2;

},

};

console.log(bar.foo0()); // 0

console.log(bar.foo1()); // 1

console.log(bar.foo2()); // 2

规范

Specification

ECMAScript® 2026 Language Specification# sec-method-definitions

浏览器兼容性

参见

get

set

Lexical grammar

Help improve MDN

Was this page helpful to you?

Yes

No

Learn how to contribute

This page was last modified on ⁨2025年7月16日⁩ by MDN contributors.

View this page on GitHub • Report a problem with this content

相关推荐

怎么看趣头条别人给我的评论
365外网足球

怎么看趣头条别人给我的评论

📅 10-12 👁️ 7343
世界杯历史上进头球最多的球员(揭秘头球绝技!世界杯头球之王的背后故事)
天下3资深玩家分析:从新门派看游戏发展
365bet苹果版

天下3资深玩家分析:从新门派看游戏发展

📅 08-15 👁️ 1480
金博宝官网app下载
beat365中国

金博宝官网app下载

📅 08-01 👁️ 2510
小米手机网速慢?教你几招轻松提升网速!
365bet苹果版

小米手机网速慢?教你几招轻松提升网速!

📅 08-25 👁️ 3918
区块链系统开发一般要多久,开发区块链系统所需时间概览
王者荣耀亚瑟怎么发育比较快
365bet苹果版

王者荣耀亚瑟怎么发育比较快

📅 09-27 👁️ 1905
科目一用什么软件学比较好?
beat365中国

科目一用什么软件学比较好?

📅 10-29 👁️ 6760
为什么有人一直跑调,自己还感觉挺好?这就是“失歌症”