JavaScript 對象基礎

目錄

  • 對象的定義
  • 對象的分類
  • 對象的創(chuàng)建
  • 對象的相關操作

1篡石、對象的定義

ECMA-262 把對象定義為:“無序屬性的集合,其屬性可以包含基本值傅事、對象或者函數(shù)委造。”嚴格來講,這就相當于說對象是一組沒有特定順序的值。對象的每個屬性或方法都有一個名字,而每個名字都映射到一個值销睁。

2供璧、對象的分類

對象可以分為三種類型,包括內建對象冻记、宿主對象和自定義對象睡毒。

  • 內建對象
    由ES標準中定義的對象,在任何的ES的實現(xiàn)中都可使用:Math 檩赢、String 吕嘀、NumberBoolean 贞瞒、Function偶房。
  • 宿主對象
    由JS運行環(huán)境提供的對象,目前主要指由瀏覽器提供的對象军浆,比如BOM棕洋、DOM
  • 自定義對象
    由開發(fā)人員自己創(chuàng)建的對象乒融。

3掰盘、對象的創(chuàng)建

在js中創(chuàng)建對象的方法可分為6種,分別是:基本模式赞季、工廠模式愧捕、構造函數(shù)模式、原型模式申钩、組合模式次绘、動態(tài)原型模式。
①基本模式

var person = new Object();
  person.name = "tutu";
  person.age = 22;
 }

②字面量模式

var person = {
 name:  "tutu",
 age: 22
}

以上基本模式\字面量模式這兩種方法在使用同一接口創(chuàng)建多個對象時撒遣,會產(chǎn)生大量重復代碼邮偎,為了解決此問題,工廠模式被開發(fā)义黎。
③工廠模式

function person(name, age)  {
  var arr = new Object();
  arr.name = name;
  arr.age = age;
  arr.sayName = function() {
    alert(this.name);
  }
  return arr;
}
var person1 = person("tutu", 22);
var person2 = person("chaoren", 18);

工廠模式解決了重復實例化多個對象的問題禾进,但沒有解決對象識別的問題(但是工廠模式卻無從識別對象的類型,因為全部都是Object廉涕,不像Date泻云、Array等,本例中火的,得到的都是o對象壶愤,對象的類型都是Object,因此出現(xiàn)了構造函數(shù)模式)馏鹤。
④構造函數(shù)模式(大寫字母開頭)

function Person(name, age) {
  this.name = name;
  this.age = age;
  this.sayName = function() {
    alert(this.name);
  };
}
var person1 = new Person("tutu", 22);
var person2 = new Person("chaoren", 18);

與工廠模式的區(qū)別是:

  • 沒有顯式地創(chuàng)建對象;
  • 直接將屬性和方法賦給了 this 對象娇哆;
  • 沒有 return 語句湃累。

構造函數(shù)也有其缺陷勃救,每個實例都包含不同的Function實例( 構造函數(shù)內的方法在做同一件事,但是實例化后卻產(chǎn)生了不同的對象治力,方法是函數(shù)蒙秒,函數(shù)也是對象)詳情見構造函數(shù)詳解,因此產(chǎn)生了原型模式宵统。
⑤ 原型模式
js中規(guī)定晕讲,每一個構造函數(shù)都有一個prototype屬性,指向另一個對象马澈,這個對象的所有屬性和方法瓢省,都會被構造函數(shù)的實例繼承,可以把那些不變的屬性和方法直接定義在prototype對象上痊班。

function person() {
 }
person.prototype.name = "tutu";
person.prototype.age = "22";
person.prototype.sayName = function () { 
  return this.name + "年齡是" + this.age;
}

var person1 = new Person();
console.log(person1.name);

var person2 = new Person();
person2.name = "chaoren";
console.log(person2.name);

原型模式的好處是所有對象實例共享它的屬性和方法(即所謂的共有屬性)勤婚,此外還可以設置實例自己的屬性(方法)(即所謂的私有屬性),可以覆蓋原型對象上的同名屬性(方法)涤伐。

⑥構造函數(shù)和原型模式的混合模式

function person(name, age) {
  this.name = name;
  this.age = age;
}

person.prototype = {
  sayName : function() {
    return this.name + "年齡是" + this.age;
  }
} 

var person1 = new Person("tutu", 22);

混合模式是將構造函數(shù)模式用于定義實例屬性馒胆,原型模式用于定義方法和共享的屬性∧混合模式共享著對相同方法的引用祝迂,又保證了每個實例有自己的私有屬性。最大限度的節(jié)省了內存器净。
⑦動態(tài)原型模式

function person(name, age) {
  this.name = name;
  this.age = age;
  if (typeof this.run != "function") {
    person.prototype = {
      run: function() {
        return this.name + "年齡是" + this.age;
      }
    }
  }
}
var person1 = new person("tutu", "22");

函數(shù)中使用if (typeof this.run != "function") 目的是為了防止創(chuàng)建多個對象時型雳,方法執(zhí)行多次。

4掌动、對象的相關操作

4.1 向對象中添加屬性

對象中保存的屬性包括屬性名和屬性值:屬性名是字符串四啰,屬性值可以是任意的數(shù)據(jù)類型,甚至也可以是一個對象粗恢。向對象中添加屬性有兩種方法:

語法1:對象.屬性名=屬性值
語法2:對象["屬性名"]=屬性值
4.2 讀取對象中的屬性

讀取對象中的屬性有兩種方法:

語法1:對象.屬性名
語法2:對象["屬性名"]

ps:如果讀取對象中沒有的屬性柑晒,不會報錯而是返回undefined;使用語法2中的方法來讀取屬性時眷射,可在[ ]中直接傳遞一個變量匙赞,這樣變量是什么就讀取什么屬性,比語法1的方法更靈活妖碉。

4.3 修改對象中的屬性

與向對象中添加屬性的兩種方法相同:

語法1:對象.屬性名=新值
語法2:對象["屬性名"]=新值
4.4 刪除對象中的屬性

刪除對象中的屬性方法為:

語法:delete 對象.屬性名
4.5檢查對象中是否包含指定的屬性

使用in運算符來檢查對象中是否包含指定的屬性涌庭,如果有則返回true,沒有返回false

語法:"屬性名" in 對象

這種方法如果對象中沒有創(chuàng)建此屬性但是原型中有這個屬性欧宜,結果也返回true坐榆。
使用對象的hasOwnProperty()來檢查自身是否含有該屬性,它只檢查自身是否含有該屬性冗茸,不含原型中的屬性席镀。

4.6 枚舉對象中的屬性

使用for...in語句來枚舉對象中的屬性匹中。

語法:
for(var 變量 in 對象){
}

在這個for循環(huán)中,對象有幾個屬性豪诲,循環(huán)體就執(zhí)行幾次顶捷,每次執(zhí)行時,都會將對象中的一個屬性名字賦值給變量屎篱。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末服赎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子交播,更是在濱河造成了極大的恐慌重虑,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堪侯,死亡現(xiàn)場離奇詭異嚎尤,居然都是意外死亡,警方通過查閱死者的電腦和手機伍宦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門芽死,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人次洼,你說我怎么就攤上這事关贵。” “怎么了卖毁?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵揖曾,是天一觀的道長。 經(jīng)常有香客問我亥啦,道長炭剪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任翔脱,我火速辦了婚禮奴拦,結果婚禮上,老公的妹妹穿的比我還像新娘届吁。我一直安慰自己错妖,他們只是感情好,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布疚沐。 她就那樣靜靜地躺著暂氯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪亮蛔。 梳的紋絲不亂的頭發(fā)上痴施,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音,去河邊找鬼晾剖。 笑死锉矢,一個胖子當著我的面吹牛梯嗽,可吹牛的內容都是我干的齿尽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼灯节,長吁一口氣:“原來是場噩夢啊……” “哼循头!你這毒婦竟也來了?” 一聲冷哼從身側響起炎疆,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤卡骂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后形入,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體全跨,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年亿遂,在試婚紗的時候發(fā)現(xiàn)自己被綠了浓若。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛇数,死狀恐怖挪钓,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情耳舅,我是刑警寧澤碌上,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站浦徊,受9級特大地震影響馏予,放射性物質發(fā)生泄漏。R本人自食惡果不足惜盔性,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一霞丧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纯出,春花似錦蚯妇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至焕襟,卻和暖如春陨收,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工务漩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拄衰,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓饵骨,卻偏偏與公主長得像翘悉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子居触,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內容

  • ??面向對象(Object-Oriented轮洋,OO)的語言有一個標志制市,那就是它們都有類的概念,而通過類可以創(chuàng)建任意...
    霜天曉閱讀 2,112評論 0 6
  • 第3章 基本概念 3.1 語法 3.2 關鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,130評論 0 21
  • 面向對象(Object-Oriented,OO)的語言有一個標志弊予,那就是它們都有類的慨念祥楣,而通過類可以創(chuàng)建任意多個...
    threetowns閱讀 878評論 0 4
  • 早期的博客3 創(chuàng)建對象的方法: object構造函數(shù)和對象字面量方法 工廠模式 自定義構造函數(shù)模式 原型模式 組合...
    索伯列夫閱讀 455評論 0 1
  • 面向對象的語言有一個標志,那就是它們都有類的概念汉柒,而通過類可以創(chuàng)建任意多個具有相同屬性和方法的對象误褪。ECMAScr...
    DHFE閱讀 972評論 0 4