一提到js構(gòu)造函數(shù),可能很多人都會想到構(gòu)造函數(shù)內(nèi)部最好不要出現(xiàn)return甚至不要出現(xiàn)return的警告語。
那么,假如js構(gòu)造函數(shù)內(nèi)部出現(xiàn)了return,又會怎樣呢?
js構(gòu)造函數(shù)內(nèi)部沒有return時:
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script type="text/javascript">
var People = function(name,age,sex){
this.name = name;
this.age = age;
this.sex =sex;
}
var p = new People(3);
</script>
</body>
</html>
輸出一下p看看結(jié)果,如圖所示:

注意紅圈圈,顯示p對象的類型是People。
如果一:
如果在構(gòu)造函數(shù)內(nèi)部添加上一個return關(guān)鍵字會怎樣呢?
var People = function(name,age,sex){
this.name = name;
this.age = age;
this.sex =sex;
return;
}
var p = new People(3);
還是輸出一下p,結(jié)果如圖所示:

是不是沒有任何變化?!所以,僅僅添加一個return關(guān)鍵字是沒有影響的。
如果二:
那如果return一個數(shù)字呢?
var People = function(name,age,sex){
this.name = name;
this.age = age;
this.sex =sex;
return 1;
}
var p = new People(3);
同上,還是輸出p查看結(jié)果,如圖所示:

是不是有沒有任何變化?!那就是了,return數(shù)字類型的也沒有影響。
如果三:
return一個字符串
var People = function(name,age,sex){
this.name = name;
this.age = age;
this.sex =sex;
return "string";
}
var p = new People(3);
結(jié)果:

結(jié)果和沒有添加return的時候是一樣的,即return字符串是沒有影響的。
如果四:
添加return undefined;
var People = function(name,age,sex){
this.name = name;
this.age = age;
this.sex =sex;
return undefined;
}
var p = new People(3);
結(jié)果如圖所示:

依然是沒有變化的,即return undefined;也是沒有影響的。
如果五:
添加return null;
var People = function(name,age,sex){
this.name = name;
this.age = age;
this.sex =sex;
return null;
}
var p = new People(3);
結(jié)果如圖所示:

對比發(fā)現(xiàn),return null;也是沒有影響的。
如果六:
添加return {};
var People = function(name,age,sex){
this.name = name;
this.age = age;
this.sex =sex;
return {};
}
var p = new People(3);
結(jié)果如圖所示:

等等,怎么顯示p的類型是Object,難道不應該是People嗎?
是的,你沒有說錯,p的類型應該是People;但這里確實顯示的是Object。說明添加return {};是有影響的,把構(gòu)造函數(shù)內(nèi)部的this給替換了。
如果七:
添加return function(){};
var People = function(name,age,sex){
this.name = name;
this.age = age;
this.sex =sex;
return function(){};
}
var p = new People(3);
結(jié)果如下:

p的類型變成了function,顯然受影響了。
綜上所述,有沒有發(fā)現(xiàn)問題?
構(gòu)造函數(shù)內(nèi)部僅僅添加return關(guān)鍵字,或者return的是數(shù)字、字符串、null、undefined等值類型的數(shù)據(jù)的時候,使用new關(guān)鍵字執(zhí)行后對新產(chǎn)生的對象是沒有影響的。
但是,一旦構(gòu)造函數(shù)內(nèi)部return的是對象、函數(shù)等引用類型的數(shù)據(jù),使用new關(guān)鍵字執(zhí)行后新對象的具體類型就被改變了。顯然,正常情況下這并不是我們想要的結(jié)果。
而且,即使return值類型的數(shù)據(jù)不會改變新對象的具體類型,但也并沒有什么實際意義。
所以呢,js構(gòu)造函數(shù)內(nèi)部還是不要出現(xiàn)return比較好啦!