猿问

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

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?这是什么情况?还是我完全理解错了?
犯罪嫌疑人X
浏览 439回答 2
2回答

汪汪一只猫

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

守候你守候我

首先,在执行效果上=>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;
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答