亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

js中創建對象的幾種方式示例介紹

2019-11-20 21:11:52
字體:
來源:轉載
供稿:網友
JavaScript中的所有事物都是對象:字符串、數組、數值、函數等。JS中并沒有類的概念,

但我們可以利用JS的語法特征,以類的思想來創建對象。

原始方法
復制代碼 代碼如下:

<script type="text/javascript">

var obj = new Object();
obj.name = "Koji"; //為對象添加屬性
obj.age = 21;
obj.showName = function(){ //為對象添加方法
alert(this.name);
}
obj.showAge = function(){
alert(this.age);
}

obj.showName(); //Koji
obj.showAge(); //21

</script>

上面的方式通過new關鍵字生成一個對象,然后根據JS是動態語言的特性添加屬性和方法,構

造一個對象。其中的this是表示調用該方法的對象。

這種方式的問題是如果需要多次創建對象,則需要重復代碼多次,不利于代碼的復用。

工廠方法
復制代碼 代碼如下:

<script type="text/javascript">

function createObj(){
var obj = new Object(); //創建對象

obj.name = "Koji";
obj.age = 21;
obj.showName = function(){
alert(this.name);
}
obj.showAge = function(){
alert(this.age);
}

return obj; //返回對象
}

var obj1 = createObj();
var obj2 = createObj();

obj1.showName(); //Koji
obj2.showAge(); //21

</script>

這種方式提高了代碼重用率,還可以改變工廠方法,傳入參數賦值。
復制代碼 代碼如下:

<script type="text/javascript">

function createObj(name, age){ //構造對象時可以傳入初始化參數
var obj = new Object(); //創建對象

obj.name = name;
obj.age = age;
obj.showName = function(){
alert(this.name);
}
obj.showAge = function(){
alert(this.age);
}

return obj; //返回對象
}

var obj1 = createObj("Koji", 22);
var obj2 = createObj("Luo", 21);

obj1.showName(); //Koji
obj1.showAge(); //22
obj2.showName(); //Luo
obj2.showAge(); //21

</script>

上面的方式雖然可以提高代碼的復用率,但和面向對象中類的概念相比有一個很大的缺陷。面

相對象強調對象的屬性私有,而對象的方法是共享的。而上面的工廠方法創建對象的時候要為每個

對象創建各自私有的方法。同時由于為每個對象都創建邏輯相同的方法,浪費內存。改進如下
復制代碼 代碼如下:

<span style="font-size:14px;"><script type="text/javascript">

function createObj(name, age){
var obj = new Object(); //創建對象

obj.name = name;
obj.age = age;
obj.showName = showName;
obj.showAge = showAge;

return obj; //返回對象
}

function showName(){ //函數也是一個對象
alert(this.name);
}

function showAge(){
alert(this.age);
}

var obj1 = createObj("Koji", 22);
var obj2 = createObj("Luo", 21);

obj1.showName(); //Koji
obj1.showAge(); //22
obj2.showName(); //Luo
obj2.showAge(); //21

</script></span>

上面通過定義連個函數對象,解決了不同對象持有函數對象的私有問題?,F在所有對象的方法都

持有上面兩個函數的引用。但這么一來的話,對象的函數又和對象成了相互獨立,不相干的了。這和

面向對象中特定方法屬于特定類的思想不符合。

構造函數方式
復制代碼 代碼如下:

<script type="text/javascript">

//定義一個構造函數,用來生成對應的對象,可以類比Java中的構造函數
function Person(name, age){

//當調用new Person的時候,在執行第一行代碼前,先生成一個Person對象,并將對象在內存中的
//索引賦值給this關鍵字,此時可以通過this關鍵字操作新生成的對象,如下面的添加屬性或方法

this.name = name; //this關鍵字不能少。為當前對象,即this關鍵字引用的對象的name屬性賦值
//,實際相當于為當前對象添加name屬性后,再為其name屬性賦值。
this.age = age;

this.showName = function(){ //為當前對象添加方法
alert(this.name);
}
this.showAge = function(){
alert(this.age);
}

//將當前對象返回給賦值符號左邊的變量(不必明確使用return)
}

var obj1 = new Person("Koji", 22); //生成一個Person對象
var obj2 = new Person("Luo", 21);

obj1.showName(); //Koji
obj1.showAge(); //22
obj2.showName(); //Luo
obj2.showAge(); //21

</script>

構造函數的方式和工廠方式一樣,會為每個對象創建獨享的函數對象。當然也可以將這些函數

對象定義在構造函數外面,這樣又有了對象和方法相互獨立的問題。

原型方法:該方法利用的對象的prototype屬性
復制代碼 代碼如下:

script type="text/javascript">

function Person(){} //定義一個空構造函數,且不能傳遞參數

//將所有的屬性的方法都賦予prototype屬性

Person.prototype.name = "Koji"; //添加屬性
Person.prototype.age = 22;

Person.prototype.showName = function(){ //添加方法
alert(this.name);
}

Person.prototype.showAge = function(){
alert(this.age);
}

var obj1 = new Person(); //生成一個Person對象
var obj2 = new Person();

obj1.showName(); //Koji
obj1.showAge(); //22
obj2.showName(); //Koji
obj2.showAge(); //22

</script>

當生成Person對象的時候prototype的屬性都賦值給了新的對象。那么屬性和方法是共享的。

該方法的問題首先是構造函數不能傳參,每個新生成的對象都有默認值。其次,方法共享沒有

任何問題,但是屬性共享就有問題,當屬性是可改變狀態的對象的時候。
復制代碼 代碼如下:

<script type="text/javascript">

function Person(){} //定義一個空構造函數,且不能傳遞參數

Person.prototype.age = 22;
Person.prototype.array = new Array("Koji", "Luo");

Person.prototype.showAge = function(){
alert(this.age);
}

Person.prototype.showArray = function(){
alert(this.array);
}

var obj1 = new Person(); //生成一個Person對象
var obj2 = new Person();

obj1.array.push("Kyo"); //向obj1的array屬性添加一個元素

obj1.showArray(); //Koji,Luo,Kyo
obj2.showArray(); //Koji,Luo,Kyo

</script>

上面的代碼通過obj1向obj1的屬性array添加元素的時候,obj2的arra屬性的元素也跟著受到

影響,原因就在于obj1和obj2對象的array屬性引用的是同一個Array對象,那么改變這個Array

對象,另一引用該Array對象的屬性自然也會受到影響

混合的構造函數/原型方式

使用構造函數定義對象的屬性,使用原型(prototype)定義對象的方法,這樣就可以做到屬性

私有,而方法共享。
復制代碼 代碼如下:

<script type="text/javascript">

function Person(name, age) {
this.name = name;
this.age = age;
this.array = new Array("Koji", "Luo");
}

Person.prototype.showName = function() {
alert(this.name);
}

Person.prototype.showArray = function() {
alert(this.array);
}

var obj1 = new Person("Koji", 22); //生成一個Person對象
var obj2 = new Person("Luo", 21);

obj1.array.push("Kyo"); //向obj1的array屬性添加一個元素

obj1.showArray(); //Koji,Luo,Kyo
obj1.showName(); //Koji
obj2.showArray(); //Koji,Luo
obj2.showName(); //Luo

</script>

屬性私有后,改變各自的屬性不會影響別的對象。同時,方法也是由各個對象共享。在語義上,

這符合了面相對象編程的要求。

動態原型方法
復制代碼 代碼如下:

<script type="text/javascript">

function Person(name, age) {
this.name = name;
this.age = age;
this.array = new Array("Koji", "Luo");

//如果Person對象中的_initialized為undefined,表明還沒有為Person的原型添加方法
if (typeof Person._initialized == "undefined")
{
Person.prototype.showName = function() {
alert(this.name);
}

Person.prototype.showArray = function() {
alert(this.array);
}

Person._initialized = true; //設置為true,不必再為prototype添加方法
}
}

var obj1 = new Person("Koji", 22); //生成一個Person對象
var obj2 = new Person("Luo", 21);

obj1.array.push("Kyo"); //向obj1的array屬性添加一個元素

obj1.showArray(); //Koji,Luo,Kyo
obj1.showName(); //Koji
obj2.showArray(); //Koji,Luo
obj2.showName(); //Luo

</script>

這種方法和構造函數/原型方式大同小異。只是將方法的添加放到了構造函數之中,同時在構造

函數Person上添加了一個屬性用來保證if語句只能成功執行一次

在實際應用中采用最廣泛的是構造函數/原型方法。動態原型方法也很流行,它在功能上和構造

函數/原型方法是等價的。不要單獨使用構造函數或原型方法。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品91在线| 成人免费视频在线观看超级碰| 欧美黄色片在线观看| 中国人与牲禽动交精品| 国外成人免费在线播放| 4438全国成人免费| 尤物yw午夜国产精品视频明星| 亚洲日韩欧美视频| 国产精品视频网| 亚洲精品视频免费| 日韩中文字幕国产精品| 欧美激情视频在线免费观看 欧美视频免费一| 国产主播在线一区| 国产精品爽黄69| 成人h片在线播放免费网站| 午夜精品福利视频| 午夜精品久久久久久久99热| 国产亚洲人成网站在线观看| 欧美电影《睫毛膏》| 在线观看日韩av| 国产精品最新在线观看| 日韩国产在线播放| 国产在线拍偷自揄拍精品| 欧美丰满少妇xxxxx| 国产精品福利无圣光在线一区| 亚洲精品91美女久久久久久久| 久久久女人电视剧免费播放下载| 伊人伊人伊人久久| 日韩中文字幕国产| 中文字幕日韩电影| 亚洲精品二三区| 国产精欧美一区二区三区| 成人国产精品免费视频| 91精品国产自产在线老师啪| 欧美在线视频观看免费网站| 亚洲成色777777在线观看影院| 久久久精品一区| 欧美精品亚州精品| 日韩成人在线视频网站| 日韩欧美高清视频| 亚洲精品一区久久久久久| 亚洲自拍在线观看| 亚洲欧洲自拍偷拍| 国产精品老牛影院在线观看| 国产美女精品视频免费观看| 精品夜色国产国偷在线| 精品女同一区二区三区在线播放| 亚洲欧美激情精品一区二区| 国产精品美乳一区二区免费| www.日韩不卡电影av| 欧美香蕉大胸在线视频观看| 中文字幕久热精品视频在线| 久久久国产成人精品| 欧美一级大片视频| 国产欧美一区二区三区四区| 色偷偷av亚洲男人的天堂| 亚洲欧美日韩图片| 亚洲人成人99网站| 亚洲自拍偷拍色图| 日本中文字幕成人| 亚洲欧美在线第一页| 综合av色偷偷网| 国产精品高潮呻吟久久av野狼| 日韩中文娱乐网| 91色中文字幕| 操人视频在线观看欧美| 久久精品小视频| 2024亚洲男人天堂| 国产在线视频一区| 国产成人精品一区二区| 91精品国产免费久久久久久| 日韩亚洲欧美成人| 色综合视频网站| 岛国视频午夜一区免费在线观看| 青青草原一区二区| 亚洲一区二区免费在线| 日韩一区二区三区xxxx| 欧美日韩亚洲系列| 欧美大尺度电影在线观看| 成人午夜黄色影院| 久热精品视频在线免费观看| 国产精品自产拍在线观看| 欧美与黑人午夜性猛交久久久| 亚洲国产精彩中文乱码av在线播放| 2020国产精品视频| 蜜臀久久99精品久久久无需会员| 国产精品扒开腿爽爽爽视频| 亚洲国产成人久久综合一区| 日韩精品www| 亚洲第一区在线观看| 亚洲精品福利免费在线观看| 538国产精品一区二区免费视频| 九九热精品视频国产| 日韩精品在线观看一区| 久久久久久久久爱| 亚洲最大成人在线| 亚洲欧美激情精品一区二区| 69av在线视频| 91在线观看免费观看| 欧美另类极品videosbest最新版本| 国产69久久精品成人看| 国产精品毛片a∨一区二区三区|国| 国产精品久久久久久亚洲影视| 最近更新的2019中文字幕| 欧美福利在线观看| 国产精品极品美女粉嫩高清在线| 97国产在线观看| 91精品视频免费看| 欧美午夜丰满在线18影院| 91精品国产电影| 91av在线免费观看视频| 成人欧美一区二区三区黑人| 亚洲xxx自由成熟| 亚洲精品自拍第一页| 欧美电影在线观看网站| 久久精品一区中文字幕| 亚洲人成电影网站色…| 亚洲欧美日韩中文在线制服| 另类少妇人与禽zozz0性伦| 中文字幕久久久| 亚洲黄页视频免费观看| 国产精品一区专区欧美日韩| 亚州av一区二区| 亚洲精品成人免费| 久色乳综合思思在线视频| 91高清视频在线免费观看| 精品福利在线看| 久久久极品av| 亚洲国产成人久久综合一区| 97福利一区二区| 高清欧美性猛交xxxx黑人猛交| 久久成人国产精品| 日本精品免费一区二区三区| 91超碰中文字幕久久精品| 国产精品高潮呻吟久久av野狼| 777国产偷窥盗摄精品视频| 欧美大片欧美激情性色a∨久久| 欧美精品一本久久男人的天堂| 欧美华人在线视频| 久久99青青精品免费观看| 38少妇精品导航| 2020久久国产精品| 高跟丝袜欧美一区| 97视频在线观看免费高清完整版在线观看| 一区二区三区动漫| 日韩女优在线播放| 欧美亚洲在线视频| 91丝袜美腿美女视频网站| 美女福利精品视频| 亚洲欧洲成视频免费观看| 精品国产欧美成人夜夜嗨| 欧美日韩xxxxx| 国产视频久久久久| 最近中文字幕2019免费| 欧美激情中文网| 日韩有码片在线观看| 亚洲自拍偷拍网址| 92福利视频午夜1000合集在线观看| 久热爱精品视频线路一| 欧美黑人性生活视频| 亚洲少妇激情视频| 日本免费一区二区三区视频观看| 自拍偷拍亚洲区| 亚洲国产精品一区二区三区|