創(chuàng)建對象的3個方法(js基礎(chǔ)——對象(1))


title: (犀牛書)

tags: 創(chuàng)建對象,對象直接量,new創(chuàng)建對象 ,原型,Object.create()


創(chuàng)建對象

  • 三個方法:通過對象直接量、關(guān)鍵字new每辟、Object.create()函數(shù)創(chuàng)建對象

1.1對象直接量

  • 什么是對象直接量?

由若干名/值對組成的映射表干旧,名/值對中間由冒號(:)分隔,名/值對之間用逗號(妹蔽,)分隔椎眯,整個映射表用花括號({})括起來 。如:


var student = {

name: 'xiaoming',

age: 12,

isStudent: true

};

  • 其中屬性名可以是:標識符 / 字符串直接量(包含空字符串)

  • 屬性值可以是: 任意類型的js表達值(表達式的值可以是原始值胳岂,也可以是對象值)


var empty = {};      //沒有任何屬性的對象

var point = {x: 0, y: 0};      //有兩個屬性的對象

var point = {x: point.x, y: point.y+1};    //一個更復(fù)雜的值

var book = {

"main title": "helloJS"编整,  //1

"sub-title": "The Definitive Guide",    //2

"for": "all audiences",    //3

author: {

firstname: "David",

surname: "Flanagan"

}

};

  • 注意,上面代碼中標注1,2,3 的地方乳丰。 屬性名分別是用字符串來表示的掌测,為什么?
  1. "main title" 屬性名字里含有空格产园,必須使用字符串表示
  1. "sub-title" 屬性名字里含有連字符汞斧,必須使用字符串
  1. "for" 屬性名字里含有保留字,必須使用字符串
  • 對象直接量的特點
  1. 對象直接量是一個表達式

  2. 這個表達式每次運算都會創(chuàng)建 并初始化 一個 新的對象

  3. 每次計算對象直接量的時候什燕,也都會計算它的每個屬性值

  4. 所以粘勒,在一個重復(fù)調(diào)用函數(shù)體中,的循環(huán)體內(nèi)屎即,使用了對象直接量,它將創(chuàng)建很多新對象庙睡,并且每一次創(chuàng)建的對象的屬性值也有可能不一樣。

1.2通過new創(chuàng)建對象

關(guān)鍵字new后跟隨一個函數(shù)調(diào)用(這里的函數(shù)成為:構(gòu)造函數(shù))技俐,就可以創(chuàng)建并初始化一個新對象乘陪。之后賦值給一個變量(一變以后的調(diào)用)。

  • 這里的構(gòu)造函數(shù)用于初始化一個新創(chuàng)建的對象雕擂。

  • js中的原始類型————都包含內(nèi)置構(gòu)造函數(shù)啡邑。如:


var o = new Object();  //創(chuàng)建一個空對象,與{}一樣

var a = new Array();    //創(chuàng)建一個空數(shù)組捂刺,與[]一樣

var d = new Date();    //創(chuàng)建一個可以表示當前時間的對象

var r = new RegExp("js")    //創(chuàng)建一個可以進行匹配模式的RegExp對象

1.3原型

  • 每一個js對象(null除外)都和另一個對象相關(guān)聯(lián)谣拣,“另一個”對象就是我們熟知的————原型。每一個對象都從原型繼承屬性族展。
  • 所有通過對象直接量創(chuàng)建的對象都具有同一個原型對象森缠,并可以通過Object.prototype獲得對原型對象的引用。
  • 通過關(guān)鍵字new和構(gòu)造函數(shù)調(diào)用創(chuàng)建的對象的原型就就是——構(gòu)造函數(shù)的prototype屬性的值仪缸。

因此贵涵,通過new Object()創(chuàng)建的對象繼承自Object.prototype,通過new Array()創(chuàng)建的對象的原型就是Array.prototype,通過new Date()創(chuàng)建的對象的原型就是Date.prototype

  • 注意:1. Object.prototype是一個沒有原型的對象选泻,它不繼承任何屬性拉盾。其余的對象都是普通對象畅卓,普通對象都具有原型举哟。

    1. 所有的內(nèi)置構(gòu)造函數(shù)(以及大部分自定義的構(gòu)造函數(shù))都有一個繼承自Object.prototype的原型助赞。

例如:Date.prototype的屬性————繼承自————Object.prototype.

因此由new Date創(chuàng)建的Date對象的屬性兼犯,同時繼承自————Date.prototype和Object.prototype

1.4 Object.create()

ES5中定義了一個名為——Object.create()的方法捂蕴,其作用是:創(chuàng)建一個新對象员淫。

Object.create(proto[, propertiesObject])

這個語法的第一個參數(shù)是:新創(chuàng)建對象的原型端盆。第二個參數(shù)是可選值怀骤,可以對對象的屬性進行操作。

通過傳入一個原型對象來創(chuàng)建一個新對象焕妙,新對象繼承自原型的屬性和方法蒋伦。

  • Object.create()是一個靜態(tài)函數(shù),不能作為不能作為某個對象的調(diào)用方法來使用焚鹊。只需要傳入所需要的原型對象即可痕届。如:

var o = Object.create({name:xiaoming, age:16 });    //o繼承了原型的屬性name與age

  • 那么,如果傳入的原型(參數(shù))是:null,會怎么樣末患? Object.create(null);??

首席null(空)研叫,被創(chuàng)造的新對象,沒有任何可繼承的方法與屬性璧针。如:不能與任何運算符工作蓝撇。甚至也不包括toString()方法。


var n = Object.create(null);    //代碼運行返回的結(jié)果是:{}陈莽。 但是n 不繼承任何方法與屬性渤昌,

  • Object.create(proto)方法創(chuàng)建一個新對象,會繼承自原形的屬性與方法走搁,那么如果我們想創(chuàng)建一個普通的空對象独柑,比如:通過對象直接量{},或new Object()這樣的方法私植,應(yīng)該怎么辦忌栅?

只需要傳入一個Object.prototype即可,例如:


var o2 = Object.create(Object.prototype);  //創(chuàng)建的新對象與{}和new Object一樣曲稼。

總結(jié)(一個強大的特性):

  1. 任意的原型都能創(chuàng)造新對象索绪。
  1. 任意的對象都可以被繼承給新對象。

ES3中可以用類似以下的代碼來模擬原型繼承:

(也是一個對象繼承函數(shù)的案例)


//inherit()返回一個繼承自原型對象P的屬性的新對象

//以下代碼中Object.create()是ES5的方法贫悄,需要驗證是否可用瑞驱。(特性偵查)

//如果不存在Object.create()方法,則退化使用其他方法窄坦。

function inherit(p) {

if(p == null) throw TypeError()  //如果對象是null唤反,則拋出異常

if(Object.create)

return Object.create(p)  //如果存在此方法優(yōu)先使用

var t = typeof p;      //否則進行進一步檢查

if(t !== "object" && t !== "function") throw TypeError();

function f(){};      //定義一個空構(gòu)造函數(shù)凳寺。

f.prototype = p;        //將構(gòu)造函數(shù)f的原型設(shè)置為p,函數(shù)f就繼承自p的屬性了

return new f();        //使用f()創(chuàng)建p的繼承對象

}

  • inherit()與Object.create()的區(qū)別

相同點:都是以參數(shù)為原型彤侍, 返回的新對象繼承自原型的屬性肠缨。

不同點:1. inherit()不能傳入null原形來創(chuàng)建對象。 2. inherit()不能接受可選的第二個參數(shù)盏阶。

  • inherit()用作:防止庫函數(shù)無意間修改那些不受你控制的對象晒奕。

因為:inherit()不是將對象直接作為參數(shù)傳入函數(shù),而是將它的繼承對象傳入函數(shù)名斟。

所以:實際上讀取的是繼承來的值吴汪。如果給繼承屬性賦值,則這些屬性只會影響繼承屬性自身蒸眠,而不是原始對象。例:


var o = {x: "don't change this value"}

library_function(inherit(o));  //防止對o的意外修改杆融。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末楞卡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子脾歇,更是在濱河造成了極大的恐慌蒋腮,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件藕各,死亡現(xiàn)場離奇詭異池摧,居然都是意外死亡,警方通過查閱死者的電腦和手機激况,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門作彤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人乌逐,你說我怎么就攤上這事竭讳。” “怎么了浙踢?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵绢慢,是天一觀的道長。 經(jīng)常有香客問我洛波,道長胰舆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任蹬挤,我火速辦了婚禮缚窿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘焰扳。我一直安慰自己滨攻,他們只是感情好够话,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著光绕,像睡著了一般女嘲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诞帐,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天欣尼,我揣著相機與錄音,去河邊找鬼停蕉。 笑死愕鼓,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的慧起。 我是一名探鬼主播菇晃,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蚓挤!你這毒婦竟也來了磺送?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤灿意,失蹤者是張志新(化名)和其女友劉穎估灿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缤剧,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡馅袁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了荒辕。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汗销。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖抵窒,靈堂內(nèi)的尸體忽然破棺而出大溜,到底是詐尸還是另有隱情,我是刑警寧澤估脆,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布钦奋,位于F島的核電站,受9級特大地震影響疙赠,放射性物質(zhì)發(fā)生泄漏付材。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一圃阳、第九天 我趴在偏房一處隱蔽的房頂上張望厌衔。 院中可真熱鬧,春花似錦捍岳、人聲如沸富寿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽页徐。三九已至苏潜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間变勇,已是汗流浹背恤左。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留搀绣,地道東北人飞袋。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像链患,于是被迫代替她去往敵國和親巧鸭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

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

  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持麻捻,譯者再次奉上一點點福利:阿里云產(chǎn)品券纲仍,享受所有官網(wǎng)優(yōu)惠,并抽取幸運大...
    HetfieldJoe閱讀 2,998評論 4 14
  • 博客內(nèi)容:什么是面向?qū)ο鬄槭裁匆嫦驅(qū)ο竺嫦驅(qū)ο缶幊痰奶匦院驮瓌t理解對象屬性創(chuàng)建對象繼承 什么是面向?qū)ο?面向?qū)ο?..
    _Dot912閱讀 1,424評論 3 12
  • 函數(shù)和對象 1芯肤、函數(shù) 1.1 函數(shù)概述 函數(shù)對于任何一門語言來說都是核心的概念。通過函數(shù)可以封裝任意多條語句压鉴,而且...
    道無虛閱讀 4,564評論 0 5
  • 詞法階段 詞法作用域是由你在寫代碼時將變量和塊作用域?qū)懺谀睦飦頉Q定的崖咨,因此當詞法分析器處理代碼時會保持作用域不變(...
    后發(fā)而先制閱讀 603評論 0 0
  • [TOC] 聲明 該系列文章只是記錄本人回顧java多線程編程時候記錄的筆記。文中所用語言并非嚴謹?shù)膶I(yè)術(shù)語(太嚴...
    hylexus閱讀 240評論 0 0