//?先一本正經(jīng)的創(chuàng)建一個構造函數(shù),其實該函數(shù)與普通函數(shù)并無區(qū)別
var?Person?=?function(name,?age)?{
????this.name?=?name;
????this.age?=?age;
????this.getName?=?function()?{
????????return?this.name;
????}
}
??//?將構造函數(shù)以參數(shù)形式傳入
??function?New(func)?{
??????//?聲明一個中間對象,該對象為最終返回的實例
??????var?res?=?{};
??????if?(func.prototype?!==?null)?{
??????????//?將實例的原型指向構造函數(shù)的原型
??????????res.__proto__?=?func.prototype;
??????}
??????//?ret為構造函數(shù)執(zhí)行的結果,這里通過apply,將構造函數(shù)內(nèi)部的this指向修改為指向res,即為實例對象
??????var?ret?=?func.apply(res,?Array.prototype.slice.call(arguments,?1));
??????//?當我們在構造函數(shù)中明確指定了返回對象時,那么new的執(zhí)行結果就是該返回對象
??????if?((typeof?ret?===?"object"?||?typeof?ret?===?"function")?&&?ret?!==?null)?{
??????????return?ret;
??????}
??????//?如果沒有明確指定返回對象,則默認返回res,這個res就是實例對象
??????return?res;
??}
??//?通過new聲明創(chuàng)建實例,這里的p1,實際接收的正是new中返回的res
??var?p1?=?New(Person,?'tom',?20);
??console.log(p1.getName());
??//?當然,這里也可以判斷出實例的類型了
??console.log(p1?instanceof?Person);?//?true這種思路對嗎?
JavaScript中構造函數(shù)new操作符的理解
夏目祐太
2017-04-03 18:38:42