js創建對象的方法以及優缺點
前言
hello! 大家好,本人是一名剛入行的菜逼前端開發程序員,希望能通過博客能學到更多東西或是能讓他人能學到東西,與更多擁有共同興趣愛好的同仁一起交流學習,一起談理想談人生,所以下決心開始寫博客。如果有哪裏寫的不正確或是不合理的地方還請各位多多指教,評論或是留言指正。
萬事開頭難,也糾結了一番,第一篇博客寫些什麼,首先想到的是對象,因爲在編程過程中,有了對象,可以創造一個世界,在現實生活中,有了對象有了對象可以創造一個民族!
所以第一篇文章要寫的是我自己總結的《js創建對象的方法以及優缺點》
- 直接創建
- 工廠模式
- 構造函數
- 原型方式
- 構造和原型的混合方式
- 動態原型方式
直接創建
var man={
name:'key',
age:18,
sex:'男',
say:function(){
alert('hello world');
}
}
優點:簡單快速。
缺點:限制了對象的重用。
工廠模式
function createMan(name,age,sex){
var man=new Object();
man.name=name;
man.age=age;
man.sex=sex;
man.say=function(){
alert('hello world');
}
return man;
}
var key=createMan('key',18,'男');
優點:使用這種方法能夠不斷重複的創建對象。
缺點:無法識別對象類型,每個對象都有自己的say 函數,不能共享同一個函數,造成內存的浪費。
構造函數
function Man(name,age,sex){
this.name=name;
this.age=age;
this.sex=sex;
this.say=function(){
alert('hello world');
}
}
var key=new Man('key',18,'男');
優點:使用這種方法能夠重複的創建對象,並且能夠識別對象的類型。
缺點:每個對象都有自己的say 函數,不能共享同一個函數,造成內存的浪費。
原型方式
function Man(){};
Man.prototype.name='key';
Man.prototype.age=18;
Man.prototype.sex='男';
Man.prototype.say=function(){
alert('hello world');
};
var key=new Man();
優點:能夠共享一個函數。
缺點:構造函數沒有參數,不能通過構造函數初始化屬性值;屬性是對象時被多個實例共享容易產生問題。
構造和原型的混合方式
function Man(name,age,sex){
this.name=name;
this.age=age;
this.sex=sex;
}
Man.prototype.say=function(){//寫在構造方法外面
alert('hello world');
}
var key=new Man('key',18,'男');
優點:所有非函數屬性都在構造函數創建,可以用構造函數賦予屬性默認值,所有實例共享一個方法,沒有浪費內存,沒有副作用【推薦】。
動態原型方式
function Man(name,age,sex){
this.name=name;
this.age=age;
this.sex=sex;
if(typeof Man.init=='undefined'){
Man.prototype.say=function(){
alert('hello world');
}
Man.init=true;
}
//這裏將Man.prototype.say寫在了構造方法裏面,只爲了更友好的編碼風格。
//這裏的Man.init是私有屬性,目的在於使Man.prototype.say創建並只執行一次,其實就是一個標誌位,一旦Man.init=true,就不滿足條件,就不再執行了。
}
var key=new Man('key',18,'男');
優點:動態原型創建對象的方法與構造函數和原型混合方式相同,即在構造函數內定義非函數屬性,而函數屬性則利用原型屬性定義。唯一的區別是賦予對象方法的位置,即提供更友好的編碼風格。
總結
好了,以上就是我個人總結的js創建對象的方法以及優缺點,也是自己博客的處女作,希望能夠對大家能有所幫助,如有不正確或是不合理或是不足的地方還請批評指出,評論或留言給我,我再將其改正過來。
目錄
瀏覽器兼容
- 所有主流瀏覽器都兼容。