javascript中初始化構造函數時new所起的做用

先看一下以下實例代碼函數

function Person(name,age){
	this.name=name;
	this.age=age;
}
Person.prototype.say=function(){
	console.log("姓名:"+this.name+",年齡:"+this.age);				
}
var p1=new Person("黎明",30);
console.log(p1.name);//黎明
p1.say();//姓名:黎明,年齡:30
複製代碼

一、new在這個過程當中執行了如下三個步驟

一、建立一個空對象;
二、而後讓這個空對象的__proto__指向函數的原型prototype,繼承了該函數的原型。
三、調用call方法,將這個空對象對象做爲函數的this傳進去,而且最後隱式的返回這個空對象 。this

二、調用構造函數使用new關鍵字的狀況

var p1=new Person("黎明",30)這句代碼的內部代碼執行以下:spa

new Person("黎明",30)={
     var obj  = {};//建立一個空對象 
	 obj.__proto__ = Person.prototype;   
	 Person.call(obj,"黎明",30);
	 return obj;
 }
複製代碼

  分析:因此new在這個過程當中的做用是,使p1繼承了Person的name和age屬性,使p1的原型指向了Person的原型,使得p1擁有了Person的所有實例屬性和原型對象,所以p1具備了name和age屬性以及say方法。new Person("黎明",30)返回的是以下所示的對象prototype

三、調用構造函數不使用new關鍵字的狀況

var p2=Person("李明",24);
 console.log(p2.name);//Cannot read property 'age' of undefined
複製代碼

  分析:此時至關於只是調用了Person("李明",24)的這樣一個普通方法,並非調用Person構造函數建立一個新的實例對象,而且該方法沒有返回值,因此調用Person("李明",24)返回的是默認值undefined。所以P2也沒有name和age屬性。code

var p2=Person("李明",24)
p1.say.call(p2);//"姓名:李明,年齡:24
複製代碼

爲何這句代碼會有輸出呢?緣由以下
cdn

一、var p2=Person("李明",24);在Person構造方法中的this表示的是window,因此就有;對象

window.name="李明";
        window.age=24;
複製代碼

二、p1.say.call(p2)中的p2表示是調用Person("李明",24)構造函數後的返回值,可是該構造函數沒有返回值,所以p2=undefined,根據call方法的定義,因此在say()方法中的this表示window。 blog

四、調用構造函數時,在內部有retun語句的狀況

function Person(name,age){
	this.name=name;
	this.age=age;
	return name;
}
 var p1=new Person("黎明",23);
 console.log(p1);//{name: "黎明",age:23}
複製代碼

function Person(name,age){
	this.name=name;
	this.age=age;
	return {};
}
 var p1=new Person("黎明",23);
 console.log(p1);//{}
複製代碼

  緣由分析:構造函數不須要顯示的返回值。使用new來建立對象(調用構造函數)時,若是return返回的是非對象(數字、字符串、布爾類型等)會忽略返回值;若是return的是對象,則返回該對象(注:若return null也會忽略返回值)。繼承

相關文章
相關標籤/搜索