Largemage 2019-08-17 22:24 采纳率: 50%
浏览 370
已采纳

为什么以闭包作为构造函数,对象访问到的构造函数内的属性是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条)

报告相同问题?

悬赏问题

  • ¥15 教务系统账号被盗号如何追溯设备
  • ¥20 delta降尺度方法,未来数据怎么降尺度
  • ¥15 c# 使用NPOI快速将datatable数据导入excel中指定sheet,要求快速高效
  • ¥15 再不同版本的系统上,TCP传输速度不一致
  • ¥15 高德地图点聚合中Marker的位置无法实时更新
  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式