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

严格模式下如何引用对象实例?实例成员访问报错求解

嘿,我来帮你搞定这个问题!你遇到的报错其实是两个核心问题导致的,咱们一个个拆解:

首先,为什么iObj会是undefined?

你的dObj是个普通函数,当你直接调用dObj()的时候,这个函数没有任何return语句,所以默认会返回undefined——这就导致后面你尝试访问iObj.v的时候,自然会报"iObj is undefined"的错误。

如果想用它创建实例对象,你需要把它当作构造函数来使用,调用的时候必须加上new关键字:

var iObj = new dObj(); // 加new,把函数当作构造函数实例化

不过这还不够,因为你函数内部的v和f都是用var声明的局部变量,属于函数的私有作用域,就算用new创建了实例,也没法直接访问这些私有变量。

然后,怎么让实例能访问到内部的属性和方法?

这里有两种常用的解决方式,你可以根据需求选:

方式一:用this绑定实例成员

把需要外部访问的属性和方法绑定到this上,这样构造函数创建的实例就能直接拿到它们:

"use strict";
var v = 25;
var dObj = function(){
    this.v = 100; // 把v绑定到实例对象上
    this.f = function(){ // 方法也绑定到this
        console.log("Inside...")
    };
    console.log(this.v); // 这里打印实例的v(100)
    console.log(window.v); // 这里打印全局的v(25)
}
var iObj = new dObj(); // 用new创建实例
console.log(iObj.v); // 现在能正常输出100了
iObj.f(); // 调用方法,输出"Inside..."

方式二:用工厂函数返回对象字面量

如果不想用new关键字,你可以让函数直接返回一个包含公共接口的对象,这样直接调用函数就能得到可用的实例:

"use strict";
var v = 25;
var dObj = function(){
    // 这里的变量是私有,外部无法直接访问
    var privateV = 100;
    var privateF = function(){
        console.log("Inside...")
    };
    console.log(privateV); // 打印私有变量100
    console.log(window.v); // 打印全局变量25
    
    // 返回暴露公共属性和方法的对象
    return {
        v: privateV,
        f: privateF
    };
}
var iObj = dObj(); // 直接调用函数获取对象
console.log(iObj.v); // 输出100
iObj.f(); // 输出"Inside..."

最后提个小细节

你原来代码里的var f=(function(){...})();是立即执行函数(IIFE),它会立刻执行,但因为没有return,所以f的值是undefined——这显然不是你想要的方法定义,直接赋值函数表达式就好啦!

内容的提问来源于stack exchange,提问作者Jean-Dadet Diasoluka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:37:29