Largemage
2019-08-17 22:24
采纳率: 85.7%
浏览 347
已采纳

为什么以闭包作为构造函数,对象访问到的构造函数内的属性是undefined?

var say="i am window";
function Speak(){
this.say="i am function";
return func=()=>{
console.log(this.say);
return this.say;
}
}
var obj=new Speak();
var str=obj();//i am function
console.log(obj.say);//undefined
console.log(str);//i am function

例子如上,以箭头函数作为返回函数只能保证this指向的是Speak函数,但是obj直接引用say属性得到的undefined,只能通过新声明另一个变量接受参数。
是不是所有闭包函数内的属性都不能被外部对象直接访问?为什么?是因为闭包的特殊性使得this指针丢失了每个属性对应的地址?
请各位大佬帮忙解答下,谢谢!
  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • 天际的海浪 2019-08-18 19:52
    已采纳

    用new 调用的构造函数会自动创建一个实例对象,并让构造函数内的this指向这个实例对象。在实例对象执行后会自动将这个实例对象做为返回值返回。
    所以构造函数一般不应该用return 来返回值。

    而你这个构造函数Speak用return 来返回值。并且返回值是一个对象(函数也是对象)则会用这个对象代替自动创建的实例对象返回给obj。
    也就是说你设置的是实例对象的say,返回给obj的却是一个箭头函数,箭头函数没有say属性。

    你是不是想设置func为实例对象的方法,应该是

    var say="i am window";
    function Speak(){
        this.say="i am function";
        this.func=()=>{
            return this.say;
        }
    }
    var obj=new Speak();
    console.log(obj.say);
    console.log(obj.func());
    
    评论
    解决 无用
    打赏 举报
查看更多回答(1条)

相关推荐 更多相似问题