JS是面向對象的語言,函數也是對象。下面大致介紹下實例,原型與構造函數之間的關系。
構造函數模式
function Person(name,age){
this.name = name;
this.age = age;
this.sayname = function(){
alert(this.name);
}
}
定義構造函數,函數名字首字母大寫,並使用new操作符實例化構造函數。構造函數本身也是函數,只不過可以用來創建對象。構造函數的特點是:
1.沒有顯式的創建對象
2.將屬性和方法賦給力this對象
3.沒有return語句
實現步驟為:
1.創建一個新對象
2.將構造函數的作用域賦給新對象(this指向這個新對象)
3.執行構造函數的代碼,給構造函數添加屬性和方法
4.返回新對象
構造函數的主要問題是,每個方法都要在每個實例上創建一遍。
原型模式
每個函數都有一個prototype屬性,這是一個指向其原型對象的指針。原型對象的好處就是可以讓對象實例共享其原型對象中的屬性和方法。
原型對象中的constructor屬性指向其構造函數。構造函數的prototype指向其原型對象。如果使用對象字面量重寫構造函數時,記得指定constructor屬性,否則constructor會指向object.
實例
new構造函數就可以創建該構造函數的實例,實例對象中的__proto__指向其構造函數對應的原型對象。
構造函數的prototype指向其原型對象,原型對象的constructor指向其構造函數,使用new關鍵字實例化構造函數,實例化對象的__proto__指向其原始的原型對象。
創建自定義對象的有效方式就是組合使用構造函數模式和原型模式。構造函數模式定義實例屬性,原型模式定義方法和公用的屬性。這樣每個實例都有自己自定義的屬性,同時又共享着對方法的引用,最大成本的節省內存。
相關操作符
delete操作符:刪除實例中的指定屬性。從而可以訪問原型中同名的屬性。
hasOwnProperty()方法:檢測一個屬性是存在於該對象的實例中,屬於實例屬性時,才返回true,否則屬於原型屬性,則返回false。
in操作符:
單獨使用時,如果該對象中存在這個屬性,則返回true,不管這個屬性是實例屬性還是原型屬性。name in object
使用for-in循環時,返回的是該對象可枚舉的所有屬性。
每個構造函數都有一個原型對象,原型對象包含一個指向構造函數的指針(constructor),而實例都包含一個指向原型對象的內部指針(__pro__)。