[JavaScript] new的用法與基本概念

對於new一個物件並不陌生,但在JavaScript裡什麼時候應該要用new,有什麼作用,終於最近較為有心得,在此做個筆記

先看以下一個例子 

function person(_name){
	this.name = _name;	
	this.getname = function () {
		return "hello " + this.name;
	}	
	return this;
}

var noNew = person("ace");
var withNew = new person("ace");

console.log(noNew.getname());
console.log(withNew.getname());

先說結果,兩個都是會產生出 "hello ace",那用不用new,有什麼差別?

大致上有兩個不同

是否呼叫constructor

noNew並沒有去new一個物件出來,所以其實是一個"正常function的執行"

withNew的話,會產生出一個person的物件,它會去"呼叫constructor"

function person(_name){
	this.name = _name;	
	this.getname = function () {
		return "hello " + this.name;
	}	
	//return this;
}
var noNew = person("ace");
var withNew = new person("ace");

console.log(withNew.getname());
console.log(noNew.getname());

我們把return this給註解掉時即可發現不一樣的地方了

noNew不會回傳任何值,因為它就是一個單純執行function的動作

 

this 大不同

noNew由於並沒有new出一個物件,而進到constructor時的this會是指到window這個物件

在JavaScript有個跟其他語言很不一樣的地方,就是物件的屬性是可以任意增加的

不會因為你沒有定義這個屬性而出錯,主要是因為沒有強型別的概念

所以指定給 this.name時,固然window這個物件沒有 name 這個屬性,所以在這邊就會被"另外"加到window去

而noNew所指到的this物件就是window

withNew

由於會呼叫constructor去創建出一個person的物件

所以this會是指向person的物件

最後再來做一個實驗

function person(_name){
	this.name = _name;	
	this.getname = function () {
		return "hello " + this.name;
	}	
	return this;
}
var noNew = person("ace");
var withNew = new person("ace");

var p = person("lee");
console.log(p === noNew); //true
console.log(p === withNew); //false

console.log(noNew.getname()); // hello lee
console.log(withNew.getname()); //hello ace

noNew跟p 都是沒有new所做的單純function呼叫,所以執行完回傳的this其實都是"window"這個物件

而withNew則是利用constructor創建一個新的物件再回傳,所以會跟noNew和p是不同型別的物件

最後可以發現 noNew跟p 共用同一個window物件,所以p會改到noNew的東西

 

參考資料

https://openhome.cc/Gossip/JavaScript/Constructor.html