JavaScript如何在对象内部引用自身的属性与方法
普通对象内部如何引用自身属性
首先给出参考的类实现写法:
class MyClass { constructor (a) { this.a = a; } foo() { // 业务逻辑 } bar() { const baz = this.foo(); // 基于baz处理业务逻辑 } }
上述类的bar()方法中,可以通过this直接调用同实例的foo()方法。如果不使用类语法,改用普通对象+工厂函数的模式实现相同逻辑,很容易写出失效的代码:
const myObj = (a) => { return { foo: () => { // 业务逻辑 }, bar: () => { const baz = foo(); // 作用域内找不到foo变量,运行报错 const baz = myObj.foo() // myObj指向外层工厂函数,不是返回的实例对象,同样不生效 // 基于baz处理业务逻辑 } } }
目前有一种可行但不够简洁的写法:先在工厂函数作用域内单独定义foo和bar函数,最后再将两个函数组装为对象返回,这种写法把方法定义和对象返回拆成了两步,结构不够聚合:
const myObj = (a) => { const foo = () => { // 业务逻辑 }; const bar = () => { const baz = foo(); // 基于baz处理业务逻辑 }; return { foo, bar }; }
核心疑问:是否存在可以直接在对象字面量内部引用对象自身属性的写法?
可行方案
问题的根源是箭头函数没有独立的this绑定,会直接继承外层作用域的this值,因此用箭头函数定义的对象方法,内部无法获取到指向当前对象的this。只要将方法定义从箭头函数改为普通函数,就可以和类写法一致,通过this访问对象自身的属性:
const myObj = (a) => { return { foo: function () { // 业务逻辑 }, bar: function () { const baz = this.foo() // 可以正常调用foo方法 // 基于baz处理业务逻辑 } } }
日常开发中更推荐使用ES6的对象方法简写语法,效果和上述普通函数定义完全一致,写法更简洁:
const myObj = (a) => { return { foo() { // 业务逻辑 }, bar() { const baz = this.foo() // 运行正常 // 基于baz处理业务逻辑 } } }
内容的提问来源于stack exchange,提问作者bradlet
相关产品推荐
相关产品推荐

