JavaScript----構造函數、原型對象、this

一、構造函數

創建一個構造函數,專門用來創建Person對象的
構造函數就是一個普通的函數,創建方式和普通函數沒有區別,不同的是構造函數習慣上首字母大寫。

構造函數與普通函數的區別

構造函數和普通函數的區別就是調用的方式不同
普通函數就是直接調用,而構造函數需要使用new關鍵字來調用

構造函數的執行流程

1.立刻創建一個新的對象
2.將新建的對象設置爲函數中的this,在構造函數中可以使用this來引用新建的對象
3.逐行執行函數中的代碼
4.將新的對象作爲返回值返回

實例:

創建一個Person構造函數
在Person構造函數中,爲每一個對象都添加了一個sayName方法,目前我們的方法是在構造函數內部創建的,也就是構造函數每執行一次就會創建一個新的sayName方法,也是所有實例的sayName都是唯一的;這樣就導致了構造函數執行一次就會創建一個新方法。
執行1000次就會創建1000個新方法,而1000個方法都是一模一樣的,這是完全沒有必要,完全可以使所有的對象共享同一個方法。

		function Person(name,age,gender){
				this.name=name;
				this.age=age;
				this.gender=gender;
				//向對象中添加一個方法
				//this.sayName = fun;
			}
			//向原型中添加sayName方法
			Person.prototype.sayName=function(){
				alert("hello,我是"+this.name);
			}
			//創建一個Person的實例
			var per = new Person("孫悟空",18,"男");
			per.sayName();

注意:將sayName方法在全局作用域中定義,污染了全局作用域的命名空間,而且定義在全局作用域中也很不安全。所以我們選擇在原型中添加sayName方法

使用同一個構造函數創建對象,我們成爲一類對象,也將一個構造函數稱爲一個類。
我們將通過一個構造函數創建的對象,稱爲是該類的實例

instanceof

使用instanceof可以檢查一個對象是否是一個類的實例
語法:對象instanceof 構造函數
如果是,則返回true;否則返回false

console.log(per instanceof Person);

所有的對象都是Object的後代,所以任何對象和object左instanceof檢查時都會返回true

console.log(dog instanceof Object);

二、原型對象

原型prototype

我們所創建的每一個函數,解析器都會向函數中添加一個屬性prototype,這個屬性對應着一個對象,這個對象就是我們所謂的原型對象。

當函數以構造函數的形式調用時,它所創建的對象中都會有一個隱含的屬性,指向該構造函數的原型對象,我們可以通過__proto__來訪問該屬性。

			function Myclass(){
				
			}
			//向Myclass的原型中添加屬性a
			Myclass.prototype.a = 123;
			
			//向Myclass的原型中添加一個方法
			Myclass.prototype.sayHello = function(){
				alert("hello");
			}
			
			var mc = new Myclass();
			
			//console.log(mc.__proto__);
			console.log(mc.a);
			mc.sayHello();

原型對象就相當於一個公共的區域,所有同一類的實例都可以訪問到這個原型對象,我們可以將對象中共有的內容,統一設置到原型對象中。
當我們訪問對象的一個屬性或方法時,它會先在對象自身中尋找,如果有則直接使用,如果沒有則會去原型對象中去尋找,如果找到則直接使用。
以後我們創建構造函數時,可以將這些對象共有的屬性和方法,統一添加到構造函數的原型對象中,這樣不用分別爲每一個對象添加,也不會影響到全局作用域,就可以使每個對象都具有這些屬性和方法了。

hasOwnProperty( )

可以使用對象的hasOwnProperty()來檢查對象自身中是否含有該屬性
使用該方法只有當對象自身中含有屬性時,纔會返回true

console.log(mc.hasOwnProperty("age"));

原型對象也是對象,所以它也有原型
當我們使用一個對象的屬性或方法時,會先在自身中尋找,自身中如果有,則直接使用;如果沒有,則去原型對象中尋找,如果原型對象中有,則使用;如果沒有,則取原型的原型中尋找;直到找到Object對象原型。
Object對象的原型沒有原型,如果在Object中依然沒有找到,則返回undefined。

console.log(mc.__proto__.__proto__.hasOwnProperty("hasOwnProperty"));

三、this

this的定義

解析器在調用函數每次都會向函數內部傳遞進一個隱含參數,這個隱含的參數就是this。
this指向的是一個對象,這個對象我們稱爲函數執行的上下文對象

this的情況

根據函數的調用方式的不同,this會指向不同的對象:
1.當以函數的形式調用時,this是window
2.當以方法調用時,誰調用方法this就是誰;
3.當以構造函數的形式調用時,this就是新創建的那個對象

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章