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

实例化JavaScript类后无法访问内部对象_obj,求问题排查

为什么调用MyClass实例的take方法时_obj总是undefined?

我通过构造函数结合立即执行函数表达式定义了MyClass类,在构造函数中初始化了内部对象_obj,并通过原型暴露take方法。代码如下:

const MyClass = (function() {
  function MyClass() {
    this._obj = {
      1: 'dfvdfvd'
    };
  }

  function get() {
    return this._obj[1];
  }

  MyClass.prototype.take = () => {
    get.call(this);
  }

  return MyClass;
}());

let x = new MyClass();
console.log(x.take())

但调用实例的take方法时,始终出现_obj为undefined的情况,请问忽略了什么问题?


问题原因及修复方案

核心问题是箭头函数不会绑定自身的this,它的this是定义时继承自外部作用域的,而非调用时的对象实例。你将take定义成箭头函数,导致它的this指向的是立即执行函数的作用域,而非MyClass的实例,自然无法访问到实例上的_obj。

修复步骤:

  1. 将take方法改为普通函数,让它在调用时动态绑定实例作为this;
  2. 让take返回get.call(this)的结果,否则console.log会输出undefined。

修改后的代码:

const MyClass = (function() {
  function MyClass() {
    this._obj = {
      1: 'dfvdfvd'
    };
  }

  function get() {
    return this._obj[1];
  }

  MyClass.prototype.take = function() {
    return get.call(this);
  }

  return MyClass;
}());

let x = new MyClass();
console.log(x.take()) // 输出: dfvdfvd

补充说明:普通函数的this是在调用时确定的,当作为对象方法调用(如x.take()),this会指向该对象实例,此时get.call(this)就能正确访问到实例的_obj。


内容的提问来源于stack exchange,提问作者Das Raf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:10:37