Object對象

屬性

  • Object.prototype: Object的原型對象忌愚。

方法

Object.assign() 用于將所有可枚舉屬性的值從一個或多個源對象復(fù)制到目標(biāo)對象。它將返回目標(biāo)對象。

語法: Object.assign(target, ...sources)

target 目標(biāo)對象茫虽。
sources 源對象屎勘。

返回值: 目標(biāo)對象

Object.assign
會跳過那些值為 null或 undefined的源對象。

不能解決深拷貝的問題

合并對象

var o1 = { a: 1 };
var o2 = { b: 2 };
var o3 = { c: 3 };

var obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1);  // { a: 1, b: 2, c: 3 }, 注意目標(biāo)對象自身也會改變共啃。

合并相同屬性的對象

var o1 = { a: 1, b: 1, c: 1 };
var o2 = { b: 2, c: 2 };
var o3 = { c: 3 };

var obj = Object.assign({}, o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
Object.create() 方法會使用指定的原型對象及其屬性去創(chuàng)建一個新的對象占调。

語法:Object.create(proto[, propertiesObject])

proto 新創(chuàng)建對象的原型對象。

propertiesObject 可選移剪。如果沒有指定為undefined究珊,則是要添加到新創(chuàng)建對象的可枚舉屬性(即其自身定義的屬性,而不是其原型鏈上的枚舉屬性)對象的屬性描述符以及相應(yīng)的屬性名稱纵苛。這些屬性對應(yīng)Object.defineProperties()的第二個參數(shù)剿涮。

返回值: 在指定原型對象上添加新屬性后的對象。

如果propertiesObject參數(shù)不是 null或一個對象赶站,則拋出一個 TypeError異常幔虏。

實現(xiàn)類式繼承

function Shape() {
  this.x = 0;
  this.y = 0;
}

Shape.prototype.move = function(x, y) {
  this.x += x;
  this.y += y;
  console.info('Shape moved.');
};

function Rectangle() {
  Shape.call(this); // call super constructor.
}

Rectangle.prototype = Object.create(Shape.prototype);
Rectangle.prototype.constructor = Rectangle;

var rect = new Rectangle();

console.log('Is rect an instance of Rectangle?',
  rect instanceof Rectangle); // true
console.log('Is rect an instance of Shape?',
  rect instanceof Shape); // true
rect.move(1, 1); // Outputs, 'Shape moved.'

當(dāng)繼承多個對象時:

function MyClass() {
     SuperClass.call(this);
     OtherSuperClass.call(this);
}

MyClass.prototype = Object.create(SuperClass.prototype);

Object.assign(MyClass.prototype, OtherSuperClass.prototype);

MyClass.prototype.constructor = MyClass;

MyClass.prototype.myMethod = function() {
     // do a thing
};
var o;

// 創(chuàng)建一個原型為null的空對象
o = Object.create(null);


o = {};
// 以字面量方式創(chuàng)建的空對象就相當(dāng)于:
o = Object.create(Object.prototype);


o = Object.create(Object.prototype, {
  // foo會成為所創(chuàng)建對象的數(shù)據(jù)屬性
  foo: { 
    writable:true,
    configurable:true,
    value: "hello" 
  },
  // bar會成為所創(chuàng)建對象的訪問器屬性
  bar: {
    configurable: false,
    get: function() { return 10 },
    set: function(value) {
      console.log("Setting `o.bar` to", value);
    }
  }
});


function Constructor(){}
o = new Constructor();
// 上面的一句就相當(dāng)于:
o = Object.create(Constructor.prototype);
// 當(dāng)然,如果在Constructor函數(shù)中有一些初始化代碼,Object.create不能執(zhí)行那些代碼


// 創(chuàng)建一個以另一個空對象為原型,且擁有一個屬性p的對象
o = Object.create({}, { p: { value: 42 } })

// 省略了的屬性特性默認(rèn)為false,所以屬性p是不可寫,不可枚舉,不可配置的:
o.p = 24
o.p
//42

o.q = 12
for (var prop in o) {
   console.log(prop)
}
//"q"

delete o.p
//false

//創(chuàng)建一個可寫的,可枚舉的,可配置的屬性p
o2 = Object.create({}, {
  p: {
    value: 42, 
    writable: true,
    enumerable: true,
    configurable: true 
  } 
});
Object.defineProperties() 方法直接在一個對象上定義新的屬性或修改現(xiàn)有屬性,并返回該對象贝椿。

語法: Object.defineProperties(obj, props)

返回值: 傳遞給函數(shù)的對象

Object.entries()方法返回一個給定對象自身可枚舉屬性的鍵值對數(shù)組想括,其排列與使用 for...in循環(huán)遍歷該對象時返回的順序一致(區(qū)別在于 for-in 循環(huán)也枚舉原型鏈中的屬性)。

語法: Object.entries(obj)

obj 可以返回其可枚舉屬性的鍵值對的對象烙博。

返回值 給定對象自身可枚舉屬性的鍵值對數(shù)組瑟蜈。

const obj = { foo: 'bar', baz: 42 };
console.log(Object.entries(obj)); // [ ['foo', 'bar'], ['baz', 42] ]

Object.entries(obj).forEach(([key, value]) => {
  console.log(`${key} ${value}`); // "a 5", "b 7", "c 9"
});

轉(zhuǎn)為map
var obj = { foo: "bar", baz: 42 }; 
var map = new Map(Object.entries(obj));
console.log(map); // Map { foo: "bar", baz: 42 }
Object.freeze() 方法可以凍結(jié)一個對象,凍結(jié)指的是不能向這個對象添加新的屬性渣窜,不能修改其已有屬性的值铺根,不能刪除已有屬性,以及不能修改該對象已有屬性的可枚舉性乔宿、可配置性位迂、可寫性。也就是說,這個對象永遠(yuǎn)是不可變的掂林。該方法返回被凍結(jié)的對象臣缀。

語法: Object.freeze(obj)

obj 要被凍結(jié)的對象。
返回值 被凍結(jié)的對象泻帮。

Object.getOwnPropertyDescriptor() 方法返回指定對象上一個自有屬性對應(yīng)的屬性描述符精置。(自有屬性指的是直接賦予該對象的屬性,不需要從原型鏈上進行查找的屬性)

語法: Object.getOwnPropertyDescriptor(obj, prop)

obj 需要查找的目標(biāo)對象
prop 目標(biāo)對象內(nèi)屬性名稱(String類型)锣杂,加引號脂倦。

返回值: 如果改屬性直接存在于對象上,返回元莫,否則返回undefined赖阻。

  class Point {
    constructor (x, y) {
      this.x = x;
      this.y = y;
    }

    toString () {
      console.log(this.x + this.y);
    }
  }

  let p = new Point(1, 'y');
  let a = Object.getOwnPropertyDescriptor(p, 'x');
  console.log(a)
Object.getOwnPropertyDescriptor

ES6中,如果第一個參數(shù)不是一個對象柒竞,就會強制轉(zhuǎn)換成一個對象政供,在ES5會報錯。

Object.getOwnPropertyDescriptors() 方法用來獲取一個對象的所有自身屬性的描述符朽基。

如果沒有任何自身屬性布隔,則返回空對象。

Object.getOwnPropertyNames()方法返回一個由指定對象的所有自身屬性的屬性名(包括不可枚舉屬性但不包括Symbol值作為名稱的屬性)組成的數(shù)組稼虎。
var obj = { 0: "a", 1: "b", 2: "c"};
console.log(Object.getOwnPropertyNames(obj).sort()); // ["0", "1", "2"]
Object.getOwnPropertySymbols() 方法會返回一個數(shù)組衅檀,該數(shù)組包含了指定對象自身的(非繼承的)所有 symbol 屬性鍵。
Object.getPrototypeOf() 方法返回指定對象的原型(內(nèi)部[[Prototype]]屬性的值)霎俩。

如果沒有繼承屬性哀军,返回null

var proto = {};
var obj = Object.create(proto);
Object.getPrototypeOf(obj) === proto; // true
Object.is()方法判斷兩個值是否是相同的值。

語法: Object.is(value1, value2);

返回一個Boolean值打却。

比較

與==區(qū)別: 不會隱式轉(zhuǎn)換類型

與===區(qū)別: 不會把+0和-0視為相等杉适,并且可以認(rèn)為NaN等于NaN。

Object.keys() 方法會返回一個由一個給定對象的自身可枚舉屬性組成的數(shù)組柳击,數(shù)組中屬性名的排列順序和使用 for...in循環(huán)遍歷該對象時返回的順序一致 (兩者的主要區(qū)別是 一個 for-in 循環(huán)還會枚舉其原型鏈上的屬性)猿推。
let arr = ["a", "b", "c"];
console.log(Object.keys(arr)); 
// ['0', '1', '2']

let anObj = { 100: 'a', 2: 'b', 7: 'c' }; 
console.log(Object.keys(anObj)); 
// ['2', '7', '100']

Object.values()

方法返回一個給定對象自己的所有可枚舉屬性值的數(shù)組,值的順序與使用for...in循環(huán)的順序相同 ( 區(qū)別在于 for-in 循環(huán)枚舉原型鏈中的屬性 )捌肴。

var obj = { foo: "bar", baz: 42 };
console.log(Object.values(obj)); // ['bar', 42]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蹬叭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子状知,更是在濱河造成了極大的恐慌秽五,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饥悴,死亡現(xiàn)場離奇詭異坦喘,居然都是意外死亡盲再,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門瓣铣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洲胖,“玉大人,你說我怎么就攤上這事坯沪。” “怎么了擒滑?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵腐晾,是天一觀的道長。 經(jīng)常有香客問我丐一,道長藻糖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任库车,我火速辦了婚禮巨柒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘柠衍。我一直安慰自己洋满,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布珍坊。 她就那樣靜靜地躺著牺勾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪阵漏。 梳的紋絲不亂的頭發(fā)上驻民,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音履怯,去河邊找鬼回还。 笑死,一個胖子當(dāng)著我的面吹牛叹洲,可吹牛的內(nèi)容都是我干的柠硕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼疹味,長吁一口氣:“原來是場噩夢啊……” “哼仅叫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起糙捺,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤诫咱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后洪灯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坎缭,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡竟痰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了掏呼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坏快。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖憎夷,靈堂內(nèi)的尸體忽然破棺而出莽鸿,到底是詐尸還是另有隱情,我是刑警寧澤拾给,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布祥得,位于F島的核電站,受9級特大地震影響蒋得,放射性物質(zhì)發(fā)生泄漏级及。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一额衙、第九天 我趴在偏房一處隱蔽的房頂上張望饮焦。 院中可真熱鬧,春花似錦窍侧、人聲如沸县踢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽殿雪。三九已至,卻和暖如春锋爪,著一層夾襖步出監(jiān)牢的瞬間丙曙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工其骄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留亏镰,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓拯爽,卻偏偏與公主長得像索抓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子毯炮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

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