創(chuàng)建對象有哪些方式


JavaScript 中的所有事物都是對象:字符串、數(shù)值、數(shù)組、函數(shù)......

此外,JavaScript允許自定義對象


JavaScript 對象

JavaScript 提供多個內(nèi)建的對象出爹,比如String,Date,Array等等
對象是帶有屬性和方法的特殊數(shù)據(jù)類型


1,工廠模式
function createPerson(name,age,job){
  var o = new Object();
  o.name = name;
  o.age = age;
  o.job = job;
  o.sayName = function(){
    console.log(this);
    console.log(this.name);
  }
  return o;
}
var person01 = createPerson("nasha",25,"doc")
person01.sayName();
console.log(person01 instanceof creatPerson) // ERR
 //  this 指向的是 {o產(chǎn)生的對象 }
// nasha

弊端:沒有解決對象的識別問題缎除,即怎么知道一個對象的類型

2严就,構(gòu)造函數(shù)模式
function Person(name,age,job){
  this.name = name;
  this.age = age;
  this.job = job;
  this.sayName = function(){
    console.log(this) // Person
    console.log(this.name) //bbb|| aaa
  }
}
var person01 = new Person("aaa",20,"doc")
var person02 = new Person("bbb",30,"teacher")
console.log(person01 instanceof Person) // true
console.log(person01 instanceof Object) // true
console.log(person01.sayName())
// Person{...}
// aa

與工廠模式相比:
1,沒有顯式的創(chuàng)建對象
2器罐,直接將屬性和方法賦值給了this對象
3梢为,沒有return語句
要創(chuàng)建person的實例,必須使用new操作符轰坊,以這種方式調(diào)用構(gòu)造函數(shù)實際上會經(jīng)歷4個步驟
1铸董,創(chuàng)建一個新的對象
2,將構(gòu)造函數(shù)的作用域賦值給新對象
3肴沫,執(zhí)行構(gòu)造函數(shù)里的代碼
4粟害,返回新的對象

創(chuàng)建自定義的構(gòu)造函數(shù)可以將它的實際標(biāo)識為一種特定的類型。

缺點(diǎn):
1颤芬,每個方法都有在每個實例上重新創(chuàng)新一遍悲幅;
2,person01和person02都有一個sayName()的方法站蝠,但兩個方法不是同一個Function實例汰具。即不同實例上同名函數(shù)是不相等的,創(chuàng)建兩個完成相同任務(wù)的function是不必要的菱魔,而且還有this對象在留荔,不需要執(zhí)行代碼前就把函數(shù)綁定在特定對象上,這樣豌习,上面的函數(shù)就可以寫成

function Person(name,age,job){
  this.name = name;
  this.age = age;
  this.job = job;
  this.sayname= sayname;
}
function sayname(){
  console.log(this);
  // do sth
}

把sayname屬性設(shè)置成全局的sayname函數(shù)存谎,這樣拔疚,由于sayname包含的是一個指向函數(shù)的指針肥隆,因此person01與person02對象就共享了同一個函數(shù)。
但是稚失,如果有很多方法栋艳,那么就定義了很多全局函數(shù),自定義的引用類型無封裝可言句各,為了解決上述問題吸占,就引入了原型模式晴叨。

3,原型模式

每創(chuàng)建一個對象都有prototype屬性(null除外)矾屯,這個屬性是一個指針兼蕊,指向一個對象,而這個對象的用途是包含可以由特定類型的所有實例共享的屬性和方法件蚕。
使用原型對象的好處是可以讓所有對象實例共享它所包含的屬性和方法孙技。

function Person() {};
Person.prototype.name = "bigbang";
Person.prototype.job = "dosth";
Person.prototype.age = 25;
Person.prototype.sayname = function() {
    console.log(this.name);
}
var person01 = new Person();

方法 isPrototypeOf()確定實例和原型之間的關(guān)聯(lián)

console.log(Person.prototype.isPrototypeOf(person01)); // true

Object.getPrototypeOf()返回的是[[prototype]]的值;

console.log(Object.getPrototypeOf(person01))
console.log(Object.getPrototypeOf(person01) === Person.prototype) // true

hasOwnProperty()方法可以檢測一個屬性是存在于一個實例中排作,還是存在原型中的牵啦。true為屬性存在于實例中。

console.log(person01.hasOwnProperty("name")); // false

更常見的做法是用一個包含所有屬性和方法的對象字面量來重寫整個原型對象妄痪,并重設(shè)constructor屬性

function Person(){}
Person.prototype = {
  name:"...",
  age: 24,
  job:"sadf",
  sayname: function(){
    ...
  }
};
Object.defineProperty(Person.prototype,"constructor",{
  enumerable: false,
  value: Person
})
原型與in操作符

有兩種方法使用in操作符:單獨(dú)使用和for-in中循環(huán)使用哈雏。
使用for-in循環(huán),返回的是所有能夠通過對象訪問的衫生,可枚舉的屬性悦冀。包括實例中的屬性,也包括存在于屬性中的屬性丘损。

var person = {
  toString: function(){
    return "My Object"  
  }
}
for(var prop in person){
  if(prop == "toString"){
    console.log('get it')
  }
}

原型對象的缺點(diǎn):
1蟹腾,省略了構(gòu)造函數(shù)傳遞初始化參數(shù)這一環(huán)節(jié),結(jié)果所有實例在默認(rèn)情況下都將獲取到相同的屬性值站故,這不是最大問題皆怕,最大問題是由其共享本性所決定的。
2西篓,對于包含基本值的屬性愈腾,可以在實例上添加同名屬性隱藏原型中的屬性,然后岂津,對于包含引用數(shù)據(jù)類型的值來說虱黄,會導(dǎo)致問題。

4吮成,組合使用構(gòu)造函數(shù)模式和原型模式

構(gòu)造函數(shù)模式用于定義實例屬性橱乱,而原型模式用于定義方法和共享的屬性。所以每個實例都會有自己的一份實例屬性副本粱甫,但同時共享著對方法的引用泳叠,最大限度的節(jié)省了內(nèi)存,同時支持向構(gòu)造函數(shù)傳遞參數(shù)茶宵。
function Person(name,age,job){
  this.name = name;
  this.age = age;
  this.job = job;
  this.friends = ['a','b'];
}
Person.prototype = {
  constructor: Person,
  sayName: function(){
    console.log(this,this.name)
  }
}
var person01 = new Person(...)

5危纫,動態(tài)原型模式

function Person(name,age,job){
  this.name = name;
  this.age = age;
  this.job = job;
  if(typeof this.sayName != "function"){
    Person.prototype.sayName = function(){
      console.log(this,this.name)
    }
  }
}

這段代碼只會在初次調(diào)用構(gòu)造函數(shù)的時候才執(zhí)行。這里對原型所做的修改,能夠立即在所有實例中得到反映种蝶。

6契耿,Object.create()

ES5定義了一個名為Object.create()的方法,它創(chuàng)建了一個新對象螃征,其中第一個參數(shù)是這個對象的原型搪桂,第二個參數(shù)對對象屬性的進(jìn)一步描述。

7盯滚,寄生構(gòu)造函數(shù)模式

8锅棕,穩(wěn)妥構(gòu)造函數(shù)模式

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市淌山,隨后出現(xiàn)的幾起案子裸燎,更是在濱河造成了極大的恐慌,老刑警劉巖泼疑,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件德绿,死亡現(xiàn)場離奇詭異,居然都是意外死亡退渗,警方通過查閱死者的電腦和手機(jī)移稳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來会油,“玉大人个粱,你說我怎么就攤上這事》妫” “怎么了都许?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嫂冻。 經(jīng)常有香客問我胶征,道長,這世上最難降的妖魔是什么桨仿? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任睛低,我火速辦了婚禮,結(jié)果婚禮上服傍,老公的妹妹穿的比我還像新娘钱雷。我一直安慰自己,他們只是感情好吹零,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布罩抗。 她就那樣靜靜地躺著,像睡著了一般瘪校。 火紅的嫁衣襯著肌膚如雪澄暮。 梳的紋絲不亂的頭發(fā)上名段,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天阱扬,我揣著相機(jī)與錄音泣懊,去河邊找鬼。 笑死麻惶,一個胖子當(dāng)著我的面吹牛馍刮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窃蹋,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼卡啰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了警没?” 一聲冷哼從身側(cè)響起匈辱,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎杀迹,沒想到半個月后亡脸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡树酪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年浅碾,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片续语。...
    茶點(diǎn)故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡垂谢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出疮茄,到底是詐尸還是另有隱情滥朱,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布力试,位于F島的核電站焚虱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏懂版。R本人自食惡果不足惜鹃栽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望躯畴。 院中可真熱鬧民鼓,春花似錦、人聲如沸蓬抄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嚷缭。三九已至饮亏,卻和暖如春耍贾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背路幸。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工荐开, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人简肴。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓晃听,卻偏偏與公主長得像,于是被迫代替她去往敵國和親砰识。 傳聞我的和親對象是個殘疾皇子能扒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評論 2 354

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