對象

1. 創(chuàng)建對象的方式

  1. 對象字面量
var obj = {
    name: 'qiqi',
    age: 25
}
  1. 通過Object構造器創(chuàng)建對象
var obj = new Object();
obj.name = 'qi';

以上兩種方法缺點: 每創(chuàng)建一個對象蝎毡,都要重新聲明一次袜刷。產(chǎn)生大量重復代碼颁股。

  1. 通過工廠模式創(chuàng)建對象
function Person(name){
    var o = new Object();
    o.name = name;
    return o;
}
var person1 = Person('aaa');

缺點:當創(chuàng)建多個相似對象時星著,無法識別是由那個對象創(chuàng)建的特笋。

  1. 通過構造函數(shù)創(chuàng)建對象
function Person(name, age) {
    this.name = name;
    this.age = age;
    this.read = function(){
        console.log('read');
    }
}

var person1 = new Person('qiqi', 25)
  • new操作符執(zhí)行的事情
    1. 創(chuàng)建一個新對象
    2. 構造函數(shù)作用域指向新對象(this指向新對象,該新對象的原型指向構造函數(shù)的prototype屬性)
    3. 執(zhí)行構造函數(shù)代碼(為新對象設置屬性)
    4. 返回新對象(若構造函數(shù)返回新對象則為該對象,若返回為空拢切。返回this對象)
      缺點: 當創(chuàng)建多個實例是蒂萎,每個實例都會創(chuàng)建一個read函數(shù)
  1. 通過原型創(chuàng)建對象
function Person() {}  
Person.prototype.z = 3;
var person1 = new Person();  
person1.x = 10;
原型鏈.png
  • 理解原型與原型鏈
    • 創(chuàng)建一個Person函數(shù)對象
    • Person函數(shù)對象默認帶一個prototype屬性,指向一個對象淮椰,該對象是Person的原型對象 (箭頭3)
    • 每個原型對象都有一個constructor屬性五慈,指向prototype屬性所在函數(shù)(如:Person) (箭頭4)
    • 通過new關鍵字構造一個person1實例 (箭頭1)
    • 每個實例person1都有一個constructor屬性,指向構造這個實例的構造器Person (箭頭2)
    • 每個實例(如:person1)內部有一個指針__proto__指向構造函數(shù)的原型對象 (箭頭5)
    • 訪問一個實例的屬性和方法主穗,現(xiàn)在實例本身中找泻拦,沒有找到就在__proto__指針指向的原型對象上找。這就是原型鏈(紅色箭頭)
    • 每個對象都是Object()實例忽媒,都繼承了Object.prototype上的屬性和方法(例如: tostring
    • Object.prototype指向null,訪問對象屬性時争拐,沿著原型鏈一直向上查找,直到null
    • in判斷屬性是否在對象的原型鏈上晦雨,hasOwnProperty判斷該對象本身是否有該屬性架曹。
    • propertyIsEnumerable屬性能否被枚舉
    • delete操作隘冲,只能刪除對象本身的屬性,不能刪除原型鏈上的屬性
  • 總結:通過new關鍵字創(chuàng)建的對象绑雄,可以繼承原型鏈上的屬性展辞,又不會修改原型鏈上的屬性
function Person() {}   //創(chuàng)建一個Person函數(shù)對象

Person.prototype.z = 3;
Person.prototype.list = ['a', 'b'];   //一個實例對list操作后,另一個實例也跟著改變

var person1 = new Person();  
person1.x = 1;

'z' in person1  //true
person1.hasOwnProperty('z') //false
person1.hasOwnProperty('x')  //true

person1.propertyIsEnumerable('x')  //true
person1.propertyIsEnumerable('toString')  //false

person1.z = 5
person1.hasOwnProperty('x')  //true

delete person1.z
person1.hasOwnProperty('z')  //false
Person.prototype.z  //3

console.log(person1.z)  //3   原型對象屬性
console.log(typeof person1.toString) // function

person1.constructor  //Person

Person.prototype.constructor  //Person

Person.prototype === person1.__proto__  //true

var a = {}
a.__proto__ === Object.prototype  //true

//Person.prototype = {name: 'a'}  與  Person.prototype.name = 'a' 的區(qū)別
 
 
//Person.prototype = {name: 'a'}
Person.prototype.constructor === Person //true
 
 
//Person.prototype = {name: 'a'},  {}是Object的實例绳慎,{}.constructor指向Object
Person.prototype.constructor === Object //true
 
 
Person.prototype = {
    constructor: 'Person'
    name: 'a'
}

缺點: 當一個實例對原型對象上的屬性操作后(比如: list),另一個實例也跟著改變漠烧。

  1. 構造函數(shù)定義屬性與原型對象定義方法相結合(應用廣泛)
function Person(name) {
    this.name = name;
}
Person.prototype = {
    constructor: Person,
    aFun: function() {
        console.log('ddd')
    }
}
 
 
var person1 = new Person('q');
  1. 通過Object.create創(chuàng)建對象
var obj = Object.create({x: 1})

obj.x  //1
obj.hasOwnProperty('x')  //false

Object.createObject內置的方法杏愤,接受一個對象參數(shù)。生成一個新對象已脓,并且新對象的原型指向參數(shù)對象珊楼。

2.

  • Object.keys(對象)獲取對象上的屬性, 不返回屬性特性enumerable: false
var o = {a: 1, b:2}
Object.keys(o)   //["a", "b"]
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市度液,隨后出現(xiàn)的幾起案子厕宗,更是在濱河造成了極大的恐慌,老刑警劉巖堕担,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件已慢,死亡現(xiàn)場離奇詭異,居然都是意外死亡霹购,警方通過查閱死者的電腦和手機佑惠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來齐疙,“玉大人膜楷,你說我怎么就攤上這事≌攴埽” “怎么了赌厅?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長轿塔。 經(jīng)常有香客問我特愿,道長,這世上最難降的妖魔是什么勾缭? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任洽议,我火速辦了婚禮,結果婚禮上漫拭,老公的妹妹穿的比我還像新娘亚兄。我一直安慰自己,他們只是感情好采驻,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布审胚。 她就那樣靜靜地躺著匈勋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膳叨。 梳的紋絲不亂的頭發(fā)上洽洁,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音菲嘴,去河邊找鬼饿自。 笑死,一個胖子當著我的面吹牛龄坪,可吹牛的內容都是我干的昭雌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼健田,長吁一口氣:“原來是場噩夢啊……” “哼烛卧!你這毒婦竟也來了?” 一聲冷哼從身側響起妓局,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤总放,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后好爬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體局雄,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年存炮,在試婚紗的時候發(fā)現(xiàn)自己被綠了哎榴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡僵蛛,死狀恐怖尚蝌,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情充尉,我是刑警寧澤飘言,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站驼侠,受9級特大地震影響姿鸿,放射性物質發(fā)生泄漏。R本人自食惡果不足惜倒源,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一苛预、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧笋熬,春花似錦热某、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筹吐。三九已至,卻和暖如春秘遏,著一層夾襖步出監(jiān)牢的瞬間丘薛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工邦危, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留洋侨,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓倦蚪,卻偏偏與公主長得像希坚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子审丘,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359