关于Object.setPrototypeOf绑定this后内部函数属性可通过this访问的疑问
为什么构造函数返回的内部函数属性能被
this访问? 直接拆解核心逻辑:你看到的this能访问ruter的属性,本质是原型方法调用时this直接指向了ruter函数对象本身,结合Object.setPrototypeOf的作用,整个流程就清晰了:
1. new Ruter()的返回规则
当用new调用构造函数时,JS引擎原本会创建一个继承自Ruter.prototype的空对象,把构造函数内部的this指向这个对象。但你在构造函数最后return ruter(内部定义的函数),所以new操作的最终结果是这个ruter函数,而非引擎默认创建的实例对象。
2. Object.setPrototypeOf(ruter, this)的真实作用
这行代码是把构造函数里的this(也就是引擎默认创建的、继承自Ruter.prototype的实例对象)设置为ruter函数的原型对象。这就给ruter搭好了原型链:ruter → 构造函数内的this对象 → Ruter.prototype → Object.prototype
这样ruter就能调用Ruter.prototype上定义的param、handler方法了。
3. 原型方法中this的指向
当你执行ruter.param()时,根据JS的方法调用规则,this会自动绑定到方法的调用者——也就是ruter函数对象。所以在param方法里的this.params,就是直接访问ruter自己的自有属性(你之前已经给ruter赋值了params = {})。
说白了:param里的this就是ruter本身,自然能访问到它的所有属性。
验证代码(你的示例)
function Ruter(options) { const opts = options || {}; function ruter(req, res, next) { ruter.handler(req, res, next); } Object.setPrototypeOf(ruter, this); ruter.params = {}; ruter.stack = []; ruter.store = {}; ruter.iname = "Local Function"; console.log(this); return ruter; } Ruter.prototype = function () {} Ruter.prototype.param = function param(name, fn) { let params = this.params[name]; console.log(this); // 这里的this就是ruter函数对象 if(!params) { params = this.params[name] = []; } params.push(fn); return this; } Ruter.prototype.handler = function handler(req, resp) { console.log("This is handler"); } let ruter = new Ruter(); ruter.param("id", () => console.log("Way maker")); console.log(ruter); console.log(ruter.iname); console.log(ruter.params)
.as-console-wrapper { bottom: auto; right: auto; top: 0; min-height: 100%; }
内容的提问来源于stack exchange,提问作者user618677
相关产品推荐
相关产品推荐

