創(chuàng)建對象的幾種方式

真是百看不如一練啊

/*var box= new Object(); //創(chuàng)建一個對象

box.name= "xiaoju";? //給對象添加一個屬性

box.age = 100;

box.run = function(){? //定義一個方法

return this.name + this.age + "運行中...";

}

var box1 = new Object();

box1.name = "nanlan";

box1.age = 200;

box1.run = function(){

return this.name +this.age;

}*/

/*alert(box.run());*/


//object構(gòu)造函數(shù)創(chuàng)建多個對象,容易造成代碼冗余

var box= new Object(); //創(chuàng)建一個對象

box.name= "xiaoju";? //給對象添加一個屬性

box.age = 100;

box.run = function(){? //定義一個方法

return this.name + this.age + "運行中...";

}

var box1 = box;

box1.name = "nanlan";

box1.age = 200;

box1.run = function(){

return this.name +this.age;

}

alert(box.run());

alert(boxbdnare 1.run());

*/


//工廠模式苏携,用函數(shù)封裝特定接口創(chuàng)建對象的細節(jié)对粪。工廠模式雖然解決了多個對象相似的問題著拭,但是并沒有解決對象識別的問題

function createObject(name,age){

varobj =newObject();

obj.name = name;

obj.age = age;

obj.run =function(){

return this.name +this.age +"運行中";

};//方法必須加上分號

returnobj;//返回對象引用,在工廠模式當中乳蛾,必須有返回語句

}//函數(shù)可以不用

function createObject2(name,age){

varobj =newObject();

obj.name = name;

obj.age = age;

obj.run =function(){

return this.name +this.age +"運行中";

};//方法必須加上分號

return obj;//返回對象引用,在工廠模式當中蹂随,必須有返回語句

} //函數(shù)可以不用加分號

varbox =? createObject("nanlan",20);

varbox1 =? createObject("xiaoju",21);

varbox2 = createObject("yunju",22);

/*

alert(box.run());

alert(box1.run());*/

alert(boxinstanceofObject);

alert(box1instanceofObject);

alert(box2instanceofObject);

//這三個提示框都是ture岳锁,可是怎么它們是誰的對象呢筛欢,box 唇聘、box1是createObject的對象迟郎,box2是createObject2的對象,所以有了以下的方式——構(gòu)造函數(shù)模式


//構(gòu)造函數(shù)模式,解決了Object多個實例的問題和工廠模式對象識別的問題

function? Box(user,age){

this.user = user;

this.age = age;

this.run = run;

}

function? Desk(user,age){

this.user = user;

this.age = age;

this.run = function(){

return this.name + this.age;

}

}

function run(){ ? //把構(gòu)造內(nèi)部的方法通過全局實現(xiàn)

return this.user + this.age;

}

//構(gòu)造函數(shù)沒有new Object() ,但它后臺自動 var obj = new Object;

//必須使用new構(gòu)造函數(shù)名表制,new Box(),Box第一個字母也是大寫的

//必須使用new 運算符

var box1 = new Box("nanlan",20);

var box2 = new Box("xiaoju",21);

alert( box1 instanceof? Object);?

alert( typeof box2);

alert(box1 instanceof? Box);

alert(box2 instanceof? Box);

alert(box3 instanceof? Box); //構(gòu)造函數(shù)能夠彌補工廠模式的缺點么介,即對象識別的問題壤短,這句代碼已經(jīng)得到體現(xiàn)慨仿,這三個提示框的輸出結(jié)果是ture,ture帘撰,false

var o = {};? //對象冒充

Box.call(o,"juju",20);

alert(o.run());*/

alert(box1.run() == box2.run()); //結(jié)果是false摧找,因為他們比較的是地址


原型模式

function Box(){}

Box.prototype = {

constructor:Box,

name:'Lee',

age:100,

family:['哥哥','姐姐','妹妹'],

run: function(){

return this.name + this.age +"運行中"

}

};

var box1 = new Box();

/!*alert(box1.family);*!/

//box1.family=["蘋果","香蕉","梨子"];

box1.family.push("蘋果","香蕉","梨子");

box1.name="xiaoju";

alert(box1.family);

var box2 = new Box();

//alert( box2.family); //結(jié)果是 哥哥慰于、姐姐唤衫、妹妹

alert(box2.family); // 結(jié)果是哥哥、姐姐休里、妹妹,蘋果,香蕉,梨子

*/

//我的天那,這是原型模式的一個缺點悴侵。按道理來說實例是不能修改原型當中的實例屬性和方法的拭嫁,但是

//很明顯在這里被修改了。原因是原型中所有屬性是很多實例共享的浇借,共享對于函數(shù)非常合適,對于包含基本類型的

//也還可以妇垢,但是如果屬性包含引用類型肉康,就存在一定的問題。解決辦法是通過組合構(gòu)造函數(shù)+原型模式去寫


/*/組合構(gòu)造函數(shù) + 原型模式*/

function Box(name,age){? //保持獨立的用構(gòu)造函數(shù)

this.name = name;

this.age = age;

this.family = ["哥哥","姐姐","妹妹"];

}

Box.prototype = {? //保持共享的用原型

constructor: Box,

run:function(){

return this.name + this.age;

}

}

var box1 = new Box('nanlan',20);

box1.family.push('弟弟');

alert(box1.family);

var box2 = new Box("xiaoju",21);

alert(box2.family); //結(jié)果是哥哥涨薪、姐姐刚夺、妹妹


/*//寄生構(gòu)造函數(shù) = 工廠模式+構(gòu)造函數(shù)模式

function Box(name,age){

var obj = new Object();

obj.name = name;

obj.age = age;

obj.run = function(){

return this.name + this.age;

}

return obj;

}

var box1 = new Box('Lee',100);

alert(box1.run());

var box2 = new Box('Jack',200);

alert(box2.run());*/


//穩(wěn)妥構(gòu)造函數(shù)

function Box(name,age){

var obj =new Object();

obj.name = name;

obj.age = age;

obj.run = function(){

return this.name +this.age;

}

return obj;

}

varbox1 = Box('nanlan',200);

alert(box1.run());

varbox2 = Box('xiaoju',100);

alert(box2.run());

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市塔粒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌船老,老刑警劉巖柳畔,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郭赐,死亡現(xiàn)場離奇詭異,居然都是意外死亡罗捎,警方通過查閱死者的電腦和手機桨菜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進店門捉偏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夭禽,“玉大人,你說我怎么就攤上這事根悼∈癯牛” “怎么了酷麦?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵沃饶,是天一觀的道長轻黑。 經(jīng)常有香客問我氓鄙,道長,這世上最難降的妖魔是什么抖拦? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮噩茄,結(jié)果婚禮上绩聘,老公的妹妹穿的比我還像新娘凿菩。我一直安慰自己,他們只是感情好叉庐,可當我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布陡叠。 她就那樣靜靜地躺著肢执,像睡著了一般预茄。 火紅的嫁衣襯著肌膚如雪耻陕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天诗宣,我揣著相機與錄音膘怕,去河邊找鬼。 笑死召庞,一個胖子當著我的面吹牛岛心,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播篮灼,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼忘古,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了诅诱?” 一聲冷哼從身側(cè)響起髓堪,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逢艘,沒想到半個月后旦袋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡疤孕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赢底。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡咳焚,死狀恐怖碑定,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情访娶,我是刑警寧澤,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布割笙,位于F島的核電站伤溉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏走净。R本人自食惡果不足惜橘洞,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一抛虏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧沸毁,春花似錦、人聲如沸搂誉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽父阻。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間趣惠,已是汗流浹背草戈。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工费韭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留弹灭,地道東北人逻翁。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓驾诈,卻偏偏與公主長得像滴铅,于是被迫代替她去往敵國和親拱烁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,930評論 2 361

推薦閱讀更多精彩內(nèi)容