如何在对象字面量的函数内部设置自身的description属性?
解决在对象方法内部为方法自身设置
description属性的问题 我来帮你梳理下可行的实现方式,先分析下你之前写法遇到的问题,再给出具体方案:
为什么你之前的写法没生效?
箭头函数的问题:箭头函数没有独立的
this上下文,它会继承外层作用域的this(比如全局作用域下就是window/global),所以this.description会赋值到全局对象上,而非tasks.test。另外箭头函数没有arguments对象,所以arguments.callee也无法使用。不过直接写tasks.test.description = '...'其实是有效的,但前提是你要在tasks初始化完成后调用test函数——如果调用时机不对(比如tasks还没完全初始化)才会失效,而且箭头函数作为对象方法本身就不符合语义,不推荐使用。命名函数的问题:你的命名函数写法其实是可行的,大概率是语法错误导致的(比如你代码里少了闭合的花括号),正确的命名函数表达式写法是可以在内部通过函数名访问自身的。
可行的实现方案
方案1:使用普通匿名函数,通过this或直接引用方法
普通函数作为对象方法时,执行时this会绑定到所属的对象(这里就是tasks),所以可以直接通过this.test访问当前方法,或者直接引用tasks.test:
var tasks = { test: function() { // 方式A:通过this访问当前方法(推荐,更灵活) this.test.description = '这是test方法的功能描述'; // 方式B:直接引用tasks.test(如果tasks是全局或当前作用域可访问的) // tasks.test.description = '这是test方法的功能描述'; } }; // 调用test后,description就被设置了 tasks.test(); console.log(tasks.test.description); // 输出:这是test方法的功能描述
方案2:使用命名函数表达式,通过函数名访问自身
命名函数表达式里的函数名在函数内部是可以访问到的,直接给这个名称对应的对象赋值description即可:
var tasks = { test: function xxx() { // 直接通过函数名xxx访问当前函数 xxx.description = '使用命名函数设置的描述'; } }; tasks.test(); console.log(tasks.test.description); // 输出:使用命名函数设置的描述
额外方案:定义时直接设置description(无需在函数内部操作)
如果你的需求是在函数定义阶段就添加description属性,而不是等到函数执行时再设置,那可以拆分定义步骤:
var tasks = {}; // 先定义函数 tasks.test = function() { // 你的业务逻辑 }; // 直接给方法添加description属性 tasks.test.description = '定义时就设置好的描述'; // 无需调用test,直接就能访问description console.log(tasks.test.description); // 输出:定义时就设置好的描述
或者用立即执行函数包裹,保持对象字面量的写法:
var tasks = { test: (function() { const testFn = function() { // 业务逻辑 }; testFn.description = '立即执行函数方式设置的描述'; return testFn; })() }; console.log(tasks.test.description); // 输出:立即执行函数方式设置的描述
内容的提问来源于stack exchange,提问作者Karolis
相关产品推荐
相关产品推荐

