You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 19:20:06