用 var anObject = new aFunction() 形式創(chuàng)建對(duì)象的過(guò)程實(shí)際上可以分為三步:
第一步是建立一個(gè)新對(duì)象叹阔;
第二步將該對(duì)象內(nèi)置的原型對(duì)象設(shè)置為構(gòu)造函數(shù)prototype引用的那個(gè)原型對(duì)象截酷;
第三步就是將該對(duì)象作為this參數(shù)調(diào)用構(gòu)造函數(shù),完成成員設(shè)置等初始化工作饶辙。
其實(shí)javascript的new關(guān)鍵字只不過(guò)做了五件事情:
1.創(chuàng)建Object
2.查找class的prototype上的所有方法蹲诀、屬性,復(fù)制一份給創(chuàng)建的Object(注意弃揽,如果prototype上有屬性是function或者數(shù)組或者Object脯爪,那么只復(fù)制指針)
3.將構(gòu)造函數(shù)classA內(nèi)部的this指向創(chuàng)建的Object
4.創(chuàng)建的Object的__proto__指向class的prototype
5.執(zhí)行構(gòu)造函數(shù)class
// 定義類 類名字是 classA
functionclassA(){
this.b=1;
}
classA.prototype.b=44;
classA.prototype.show?=function(){
alert(this.b);
};
//?用new實(shí)例化
varb?=newclassA();
b.show();
//?用函數(shù)實(shí)例化
functionnewClass(cls,args){
varobj?=?{};
for(varpincls.prototype)
obj[p]?=?cls.prototype[p];
obj.__proto__?=?cls.prototype;
cls.apply(obj,args||[]);
returnobj;
};
vark?=?newClass(classA);
k.show();