国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

JS對象創建的幾種方式整理

2019-11-19 17:23:18
字體:
來源:轉載
供稿:網友

最近一直在看JS高級程序設計這本書,有空來梳理一下幾種創建對象的方式。話不多說,直接步入正題。

第一種:Object構造函數創建

var Person = new Object();Person.name = 'Nike';Person.age = 29;

這行代碼創建了Object引用類型的一個新實例,然后把實例保存在變量Person中。

第二種:使用對象字面量表示法

var Person = {};//相當于var Person = new Object();var Person = { name:'Nike'; age:29;  }

對象字面量是對象定義的一種簡寫形式,目的在于簡化創建包含大量屬性的對象的過程。也就是說,第一種和第二種方式創建對象的方法其實都是一樣的,只是寫法上的區別不同

在介紹第三種的創建方法之前,我們應該要明白為什么還要用別的方法來創建對象,也就是第一種,第二種方法的缺點所在:它們都是用了同一個接口創建很多對象,會產生大量的重復代碼,就是如果你有100個對象,那你要輸入100次很多相同的代碼。那我們有什么方法來避免過多的重復代碼呢,就是把創建對象的過程封裝在函數體內,通過函數的調用直接生成對象。

第三種:使用工廠模式創建對象

function createPerson(name,age,job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){  alert(this.name);  }; return o; }var person1 = createPerson('Nike',29,'teacher');var person2 = createPerson('Arvin',20,'student');

在使用工廠模式創建對象的時候,我們都可以注意到,在createPerson函數中,返回的是一個對象。那么我們就無法判斷返回的對象究竟是一個什么樣的類型。于是就出現了第四種創建對象的模式。

第四種:使用構造函數創建對象

function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.sayName = function(){ alert(this.name); }; }var person1 = new Person('Nike',29,'teacher');var person2 = new Person('Arvin',20,'student');

對比工廠模式,我們可以發現以下區別:

1.沒有顯示地創建對象

2.直接將屬性和方法賦給了this對象

3.沒有return語句

4.終于可以識別的對象的類型。對于檢測對象類型,我們應該使用instanceof操作符,我們來進行自主檢測:

alert(person1 instanceof Object);//turealert(person1 instanceof Person);//turealert(person2 instanceof Object);//turealert(person2 instanceof Object);//ture

同時我們也應該明白,按照慣例,構造函數始終要應該以一個大寫字母開頭,而非構造函數則應該以一個小寫字母開頭。

那么構造函數確實挺好用的,但是它也有它的缺點:

就是每個方法都要在每個實例上重新創建一遍,方法指的就是我們在對象里面定義的函數。如果方法的數量很多,就會占用很多不必要的內存。于是出現了第五種創建對象的方法

第五種:原型創建對象模式

function Person(){}Person.prototype.name = 'Nike';Person.prototype.age = 20;Person.prototype.jbo = 'teacher';Person.prototype.sayName = function(){ alert(this.name);};var person1 = new Person();person1.sayName();

使用原型創建對象的方式,可以讓所有對象實例共享它所包含的屬性和方法。

如果是使用原型創建對象模式,請看下面代碼:

function Person(){}Person.prototype.name = 'Nike';Person.prototype.age = 20;Person.prototype.jbo = 'teacher';Person.prototype.sayName = function(){ alert(this.name);};var person1 = new Person();var person2 = new Person();person1.name ='Greg';alert(person1.name); //'Greg' --來自實例alert(person2.name); //'Nike' --來自原型

當為對象實例添加一個屬性時,這個屬性就會屏蔽原型對象中保存的同名屬性。

這時候我們就可以使用構造函數模式與原型模式結合的方式,構造函數模式用于定義實例屬性,而原型模式用于定義方法和共享的屬性

第六種:組合使用構造函數模式和原型模式

function Person(name,age,job){ this.name =name; this.age = age; this.job = job;}Person.prototype = { constructor:Person, sayName: function(){ alert(this.name); };}var person1 = new Person('Nike',20,'teacher');

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持武林網!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新乡市| 丰原市| 隆昌县| 修文县| 珲春市| 德兴市| 千阳县| 莒南县| 新兴县| 南木林县| 佛学| 天峨县| 大厂| 桃园市| 雷波县| 通山县| 邓州市| 大田县| 嘉鱼县| 芜湖县| 武乡县| 壤塘县| 霍邱县| 邻水| 张家港市| 新野县| 会同县| 宁晋县| 太仓市| 金沙县| 六盘水市| 南丹县| 湖口县| 漳平市| 德安县| 萝北县| 晋州市| 共和县| 玉环县| 格尔木市| 湖口县|