严格模式下如何引用对象实例?实例成员访问报错求解
嘿,我来帮你搞定这个问题!你遇到的报错其实是两个核心问题导致的,咱们一个个拆解:
首先,为什么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
相关产品推荐
相关产品推荐

