真是百看不如一練啊
/*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());