在js中,如果你想輸入一個的信息,例如姓名,性別,年齡等,如果你用值類型來存儲的話,那么你就必須要聲明很多個變量才行,變量聲明的多了的話,就會造成變量污染。所以最好的方式就是存儲到對象中。下面能我就給大家介紹幾種創建對象的方式,並且給大家說一下他們的優缺點
方式一:對象字面量
var obj={ name:"趙雲", type:"突進", skill:"搶人頭" }
缺點:只能創建一次對象,復用性較差,如果要創建多個對象,代碼冗余度太高
方式二:使用內置構造函數
var obj=new Object(); obj.name="李白"; obj.type="刺客"; obj.skill="舞劍";
缺點:只能創建一次對象,復用性較差,如果要創建多個對象,代碼冗余度太高
方式三:工廠模式(不推薦使用)
function creat(name,type,skill){ var obj=new Object(); obj.name=name; obj.type=type; obj.skill=skill; obj.say=function(){ console.log("黃河之水天上來"); } return obj; } var hero=creat("李白","刺客","寫詩"); var heroNext=creat("趙雲","突進","將軍");
缺點:對象無法識別,因為所有的實例都指向一個原型
方法四:構造函數模式
function Person(singer,song,type){ //默認吧this傳給new出來的對象,並且默認是返回該對象 this.singer=singer; this.song=song; this.type=type; } var obj=new Person("田馥甄","小幸運","流行歌"); console.log(obj);
注意點:1.如果不寫返回值,默認返回的是新創建出來的對象 (一般都不會去寫這個return語句)
2.如果我們自己寫return語句 return的是空值(return;),或者是基本類型的值或者null,都會默認返回新創建出來的對象
3.如果返回的是object類型的值,將不會返回剛才新創建的對象,取而代之的是return后面的值
優點:實例時可以識別為一個特定的類型
缺點:構造函數中定義函數,那么每次創建對象,都會重新創建該函數,這樣會導致全局變量增多,造成污染,代碼結構會混亂,不易維護
方法五:原型
function Person(name, age, gender) { this.name = name; this.age = age; this.gender = gender; } var p =new Person("張學友",18,"male"); var p1 = new Person("劉德華",19,"male"); Person.prototype.sayHello = function () { console.log("你好我是" + this.name); } Person.prototype["sing"] = function () { console.log("一千個傷心的母牛"); } p.sayHello(); p1.sayHello(); p.sing(); p1.sing();
優點:說明:構造函數的原型對象中的成員,可以被該構造函數創建出來的所有對象訪問,而且,所有的對象共享該對象,所以,我們可以將構造函數中需要創建的函數,放到原型對象中存儲,這樣就解決 全局變量污染的問題 以及 代碼結構混亂的問題
缺點:不能初始化參數