为了账号安全,请及时绑定邮箱和手机立即绑定

如何理解关于构造函数的这段代码?

如何理解关于构造函数的这段代码?

犯罪嫌疑人X 2019-05-25 14:56:48
varClass=function(){varklass=function(){};klass.prototype.init=function(){};//定义prototype的别名klass.fn=klass.prototype;//定义类的别名klass.fn.parent=klass;//给类添加属性klass.extend=function(obj){varextended=obj.extended;for(variinobj){klass[i]=obj[i];}if(extended)extended(klass)};//给实例添加属性klass.include=function(obj){varincluded=obj.included;for(variinobj){klass.fn[i]=obj[i];}if(included)included(klass)};returnklass;};varPerson=newClass;Person.include({save:function(id){console.log("idis:"+id);},exists:function(id){/*...*/}});varperson=newPerson;person.save();关于两个new的问题,第一个是new的是klass的实例,第二个new的是什么?打印出来的Person的原型是klass,person也是klass?这是什么情况?还是我完全理解错了?
查看完整描述

2 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

根据MDNnew操作符:
当代码newfoo(...)执行时:
一个新对象被创建。它继承自foo.prototype.
构造函数foo被执行。执行的时候,相应的传参会被传入,同时上下文(this)会被指定为这个新实例。newfoo等同于newfoo(),只能用在不传递任何参数的情况。
如果构造函数返回了一个“对象”,那么这个对象会取代整个new出来的结果。如果构造函数没有返回对象,那么new出来的结果为步骤1创建的对象,ps:一般情况下构造函数不返回任何值,不过用户如果想覆盖这个返回值,可以自己选择返回一个普通对象来覆盖。当然,返回数组也会覆盖,因为数组也是对象。
根据第3条,所以,在该例中,构造函数Class通过returnklass;返回一个函数这一对象,所以通过该对象可以再次构造Person类的实例.在Javascript中,函数也是对象.根据MDNfunction:
在JavaScript中,每个函数实际上都是一个Function对象。
                            
查看完整回答
反对 回复 2019-05-25
?
守候你守候我

TA贡献1802条经验 获得超10个赞

首先,在执行效果上=>new函数名===函数名()实际他们两个并不相等,因为new函数名是重新开辟空间,复制函数。
varPerson=newClass;等效于=>varPaerson=Class();因为Class这个函数的最后,return了klass这个函数,所以上面那句又等效于=>varPaerson=klass;注意klass是被return回来的函数,是闭包,所以可以看做是在Class函数内部,用"Paerson"这个字符串替换了"klass",klass所有可以访问的变量、函数,Paerson同样可以访问、执行。
接着执行Person.include();并且传入了一个obj;而Person.include()==klass.include();所以
Person.include({
save:function(id){console.log("idis:"+id);},
exists:function(id){/*...*/}
});
等效于
klass.include({
save:function(id){console.log("idis:"+id);},
exists:function(id){/*...*/}
});
执行这个函数;函数的执行结果是,把传入的这个obj的每一项,都绑定到klass.fn这个对象中而klass.fn=klass.prototype;显而易见了,给klass的原型对象中加入了这些成员。这样一来,所有被klass实例化出来的对象,也都有了这些成员。
下面一句varperson=newPerson;等效于varperson=newKlass();注意这里的Klass函数是带括号的,所以在这里充当了构造函数,person是被实例出来的对象.所以person这个对象,就拥有了Klass这个函数的原型对象上的所有成员。所以person.save==function(id){console.log("idis:"+id);};所以person.save()执行了后面的函数,而它没有传参,所以形参id===undefined;
                            
查看完整回答
反对 回复 2019-05-25
  • 2 回答
  • 0 关注
  • 438 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信