JavaScript中如何扩展带参函数并访问其参数?
问题解决方案
你的问题核心在于作用域隔离:firstName是provider函数的局部参数,只有provider内部定义的函数(比如原method)能通过闭包访问它。而extender里的method_2是在另一个作用域创建的,自然拿不到这个变量。
下面给两种可行的解决思路:
思路1:把参数存为对象属性(推荐)
将firstName作为返回对象的一个属性,这样所有扩展的方法都能通过this访问到它,这也是更符合面向对象设计的方式:
const provider = (firstName) => ({ firstName, // 把参数挂载到对象上 lastName: "Doe", id: 5566, method: function() { return this.firstName + " " + this.lastName; // 改用this访问属性 } }); const extender = (prov) => ({ ...prov, method_2: function (){ return this.firstName + " " + this.lastName; // 直接通过this访问firstName } }); // 测试代码 console.log(provider("John").method()) // 输出 "John Doe" const ext_inst = extender(provider("John")) console.log(ext_inst.method()) // 输出 "John Doe" console.log(ext_inst.method_2()) // 输出 "John Doe"
思路2:手动传递参数给extender
如果不想修改原provider函数,可以在调用extender时额外传入firstName,让method_2通过闭包访问这个参数:
const provider = (firstName) => ({ lastName: "Doe", id: 5566, method: function() { return firstName + " " + this.lastName; } }); const extender = (prov, firstName) => ({ ...prov, method_2: function (){ return firstName + " " + this.lastName; } }); // 测试代码 console.log(provider("John").method()) // 输出 "John Doe" const ext_inst = extender(provider("John"), "John") console.log(ext_inst.method()) // 输出 "John Doe" console.log(ext_inst.method_2()) // 输出 "John Doe"
这种方式虽然能解决问题,但需要重复传递参数,代码冗余度高,不如第一种方案优雅。
内容的提问来源于stack exchange,提问作者iaggo
相关产品推荐
相关产品推荐

