为什么JS对象中可用c(){}简写定义方法而非c:function(){}?
对象方法简写语法的由来与原理
这种c(){}的写法是ES6(ECMAScript 2015)为对象字面量新增的方法简写语法,目的是简化对象内函数属性的定义,让代码更简洁直观。
语法等价性(大部分场景)
在不涉及super关键字的情况下,它和传统的c: function(){}写法几乎等价:
// 简写形式 const object1 = { a: 'somestring', b: 42, c(){}, }; // 等价于(无super时) const object1 = { a: 'somestring', b: 42, c: function(){}, };
核心差异与设计意图
不过两者存在一个关键区别:方法简写定义的函数会拥有[[HomeObject]]内部属性,指向当前定义它的对象。这一设计是为了支持ES6的super关键字——当你在方法中使用super时,JS引擎会通过[[HomeObject]]找到该对象的原型,进而调用原型上的同名方法。
比如:
const proto = { foo() { console.log('proto foo'); } }; const obj = { __proto__: proto, // 方法简写,有[[HomeObject]] foo() { super.foo(); // 能正确调用proto.foo() } }; // 而如果用传统写法: const obj2 = { __proto__: proto, foo: function() { super.foo(); // 报错!因为普通函数没有[[HomeObject]],无法识别super } };
额外优势
- 代码更简洁,减少冗余的
function关键字和冒号,符合现代JS的简洁风格 - 明确区分对象的数据属性和方法属性,语义更清晰
内容的提问来源于stack exchange,提问作者Johnny Chen
相关产品推荐
相关产品推荐

