欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JS 創(chuàng)建對(duì)象(常見的幾種方法)

 更新時(shí)間:2008年11月03日 15:43:39   作者:  
方便學(xué)習(xí)js類的朋友,讓你快速的掌握js類的定義方法,方法有很多種,結(jié)果都一樣。大家可以根據(jù)自己的愛好選用。
貼個(gè)代碼先:
function O(user,pwd){ //use constructor
this.user=user;
this.pwd=pwd;
this.get=get;
return this;
}
function O2(user,pwd){ //use factory
var obj=new Object();
obj.user=user;
obj.pwd=pwd;
obj.get=get;
return obj;
}
function O3(){ //use prototype
}
O3.prototype.user='abc';
O3.prototype.pwd='dis';
// O3.propotype.get='get';
//O3.prototype.get(){
//alert(this.pwd);
//}
function O4(user,pwd){
this.user=user;
this.pwd=pwd;
return this;
}
O4.prototype.get=function(){alert('123');}

//function get(){
//alert("This User:"+this.user);
// }
function test2(){
//var a=new O2('Us','Pw'); use factory & constructor
//var a=new O3(); //use prototype
//a.get();
var a=new O4('*U4','P4'); //混合
//a.user='Not ABC'; //set new property
//alert(a.user);
a.get();
}
常用的MS 就這幾種,可能還有其它的.碰到再說吧....
題外話:昨天手欠,試圖用alert(window.appName)到ff之下去查看瀏覽器版本,結(jié)果彈出的竟然是Netscape,咋不是 firefox。繼而又跑去chrome下試驗(yàn),又一次彈出了Netscape。baidu搜 Netscape 竟然發(fā)現(xiàn)js就出自Netscape公司。慚愧啊慚愧?。?!研究了這么久的js都不認(rèn)識(shí)祖師爺。于是又跑去找了找族譜,原來js出自Brendan Eich之手,95年他創(chuàng)造js時(shí)候,也不過就31歲。哎呀,真是白活了,如他一般老的我,到現(xiàn)在都學(xué)不會(huì)js,真是人比人氣死人。。js當(dāng)初設(shè)計(jì)的時(shí)候,沒有想到自己能從一部打電話用的手機(jī)變成集拍照,上網(wǎng),游戲,電話于一身的智能機(jī)。真是造化弄人!?。∫苍S各中的神奇,連Brendan Eich本人都沒有想到。應(yīng)該說Brendan Eich創(chuàng)造了js,而一大批的js牛人成就了今天如此復(fù)雜的js。
js不是木有類么?沒關(guān)系,人家不是設(shè)計(jì)了原型屬性么~
js不是木有塊級(jí)作用域么?沒關(guān)系,人家不是有作用域鏈么~
js怎樣實(shí)現(xiàn)成員變量私有化?哦,用閉包解決吧~
哦,這么多基本概念,徹底的暈掉了,路漫漫其修遠(yuǎn)兮。
言歸正傳,本文討論幾種js創(chuàng)建對(duì)象的方法,先從最好理解的工廠模式開始:
復(fù)制代碼 代碼如下:

function createPerson(name,age,job){
var o = {};
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
}
var tanya = createPerson("tanya","30","female");
var ansel = createPerson("ansel","30","male");
tanya.sayName();
ansel.sayName();

這里先定義o為一個(gè)空的對(duì)象,然后為o設(shè)置了一堆屬性。其實(shí)也可以直接給o屬性的嘛,所以如果這樣寫也是ok的。
復(fù)制代碼 代碼如下:

function createPerson(name,age,job){
var o = {
name : name,
age : age,
job : job,
sayName : function(){
alert(this.name);
}
};
return o;
}
var tanya = createPerson("tanya","30","female");
var ansel = createPerson("ansel","30","male");
tanya.sayName();
ansel.sayName();

還有一種辦法是利用無敵的this,因?yàn)閠his就表示當(dāng)前運(yùn)行時(shí)的對(duì)象,將構(gòu)造函數(shù)this的作用域指向新對(duì)象,將當(dāng)前運(yùn)行對(duì)象的屬性和方法都賦給新對(duì)象,這樣對(duì)象模式稱為構(gòu)造函數(shù)模式
復(fù)制代碼 代碼如下:

function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
};
}
var tanya = new Person("tanya","30","female");
var ansel = new Person("ansel","30","male");
tanya.sayName();
ansel.sayName();

在這個(gè)例子中,tanya和ansel都有一個(gè)constructor屬性,該屬性指向person。
考慮一下如下的情況:
復(fù)制代碼 代碼如下:

function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
};
}
Person("tanya","30","female");
Person("ansel","30","male");
window.sayName();
window.sayName();

發(fā)現(xiàn)兩次彈出的都是ansel,這是因?yàn)椴挥胣ew的話,就不是一個(gè)person的實(shí)例,而僅僅在執(zhí)行函數(shù)。而在全局作用域調(diào)用一個(gè)函數(shù)時(shí)this總是指向Global對(duì)象。而Global對(duì)象在瀏覽器中就是window對(duì)象。
我們還可以用構(gòu)造模式在另外一個(gè)對(duì)象中調(diào)用sayName方法,還記得Apply和call么,來吧再考慮另外一種情況,
復(fù)制代碼 代碼如下:

function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
};
}
var olivia = {};
Person.call(olivia,"tanya","30","female");
olivia.sayName();
var philip = {}
Person.apply(philip,["ansel","30","male"]);
philip.sayName();

原型模式就要考慮原型鏈了,分析一下,sayName方法在實(shí)例中被重復(fù)定義了兩次,但其實(shí)沒有必要?jiǎng)?chuàng)造兩個(gè)一樣的副本。使用原型方法,可以使是tanya和ansel的共享一個(gè)sayName方法。
于是原型模式的寫法如下:
復(fù)制代碼 代碼如下:

function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
}
Person.prototype.sayName= function(){
alert(this.name);
};
var tanya = new Person("tanya","30","female");
var ansel = new Person("ansel","30","male");
tanya.sayName();
ansel.sayName();

實(shí)際應(yīng)用時(shí),不是一成不變的套用某種模式,活學(xué)活用。需要共享方法的時(shí)候就用原型模式,需要使用副本的時(shí)候就用構(gòu)造模式,還可以結(jié)合起來,把所有信息都封裝在構(gòu)造函數(shù)中,而通過在構(gòu)造函數(shù)中初始化原型,使得對(duì)象保持了同時(shí)使用構(gòu)造函數(shù)和原型的優(yōu)點(diǎn)。
復(fù)制代碼 代碼如下:

function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
if (typeof sayName != "function" ){
Person.prototype.sayName= function(){
alert(this.name);
};
}
}
var tanya = new Person("tanya","30","female");
var ansel = new Person("ansel","30","male");
ansel.sayName = function () {
alert("Hi ansel, how hansome you are!");
}
tanya.sayName();
ansel.sayName();

相關(guān)文章

  • JavaScript 面向?qū)ο缶幊蹋?) 基礎(chǔ)

    JavaScript 面向?qū)ο缶幊蹋?) 基礎(chǔ)

    自從有了Ajax這個(gè)概念,JavaScript作為Ajax的利器,其作用一路飆升。JavaScript最基本的使用,以及語法、瀏覽器對(duì)象等等東東在這里就不累贅了。把主要篇幅放在如何實(shí)現(xiàn)JavaScript的面向?qū)ο缶幊谭矫妗?/div> 2010-05-05
  • javascript 寫類方式之六

    javascript 寫類方式之六

    這篇開始會(huì)分析流行的js庫之寫類方式。各種庫的寫類方式雖然千奇百怪,但仍然逃離不了本質(zhì)---用構(gòu)造函數(shù)和原型 來組裝類。
    2009-07-07
  • JS面向?qū)ο缶幊?for Cookie

    JS面向?qū)ο缶幊?for Cookie

    前一些天做項(xiàng)目的時(shí)候?qū)懥艘粋€(gè)通用的OO By Class Cookie今天把它放上來給大家分享下!
    2010-09-09
  • JavaScript對(duì)象鏈?zhǔn)讲僮鞔a(jquery)

    JavaScript對(duì)象鏈?zhǔn)讲僮鞔a(jquery)

    自從使用了jQuery以后,對(duì)它的鏈?zhǔn)讲僮骱苁且蕾?,以至于常常覺得其他庫不好用。。
    2010-07-07
  • JavaScript 面向?qū)ο笕腴T精簡(jiǎn)篇

    JavaScript 面向?qū)ο笕腴T精簡(jiǎn)篇

    圍繞面向?qū)ο蟮膸状箨P(guān)鍵字:封裝 ,繼承 ,多態(tài) ,展開JavaScript面向?qū)ο?/div> 2009-03-03
  • javascript 類和命名空間的模擬代碼

    javascript 類和命名空間的模擬代碼

    就當(dāng)我是重復(fù)造輪子吧,整理該文檔給有需要的人用,包括我:)
    2010-10-10
  • JS類的封裝及實(shí)現(xiàn)代碼

    JS類的封裝及實(shí)現(xiàn)代碼

    js并不是一種面向?qū)ο虻恼Z言, 沒有提供對(duì)類的支持, 因此我們不能像在傳統(tǒng)的語言里那樣 用class來定義類, 但我們可以利用js的閉包封裝機(jī)制來實(shí)現(xiàn)js類, 我們來封裝一個(gè)簡(jiǎn)的Shape類.
    2009-12-12
  • javascript面向?qū)ο缶幊檀a

    javascript面向?qū)ο缶幊檀a

    javascript面向?qū)ο缶幊檀a,學(xué)習(xí)js面向?qū)ο缶幊痰呐笥芽梢詤⒖枷隆?/div> 2011-12-12
  • 最新評(píng)論