js Object 常用方法

Object.assign(target,source1,source2,...)

該方法主要用于對(duì)象的合并,將源對(duì)象source的所有可枚舉屬性合并到目標(biāo)對(duì)象target上,此方法只拷貝源對(duì)象的自身屬性,不拷貝繼承的屬性则奥。

  • Object.assign方法實(shí)行的是淺拷貝,而不是深拷貝暮胧。也就是說题禀,如果源對(duì)象某個(gè)屬性的值是對(duì)象,那么目標(biāo)對(duì)象拷貝得到的是這個(gè)對(duì)象的引用筒主。同名屬性會(huì)替換。
  • Object.assign只能進(jìn)行值的復(fù)制鸟蟹,如果要復(fù)制的值是一個(gè)取值函數(shù)乌妙,那么將求值后再?gòu)?fù)制
  • Object.assign可以用來處理數(shù)組建钥,但是會(huì)把數(shù)組視為對(duì)象藤韵。
const target = {
    x : 0,
    y : 1
};
const source = {
    x : 1,
    z : 2 ,
    fn : {
        number : 1
    }
};
Object.assign(target, source);  
// target  {x : 1, y : 1, z : 2, fn : {number : 1}}  //同名屬性x被覆蓋
// source  {x : 1, z : 2, fn : {number : 1}}
target.fn.number = 2;  // 拷貝為對(duì)象引用,源對(duì)象source中的值也會(huì)被修改
// source  {x : 1, z : 2, fn : {number : 2}}
 
 
function Person(){
    this.name = 1
};
Person.prototype.country = 'china';
let student = new Person();
student.age = 29 ;
const young = {insterst : 'sport'};
Object.assign(young,student);
// young {instest : 'sport' , age : 29, name: 1}  // 只能拷貝自身的屬性,不能拷貝prototype
 
 
Object.assign([1, 2, 3], [4, 5])                      // 把數(shù)組當(dāng)作對(duì)象來處理
// [4, 5, 3]

Object.create(prototype[,propertiesObject])

使用指定的原型對(duì)象及其屬性去創(chuàng)建一個(gè)新的對(duì)象

var parent = {
    x : 1,
    y : 1
}
var child = Object.create(parent,{
    z : {                           // z會(huì)成為創(chuàng)建對(duì)象的屬性
        writable:true,
        configurable:true,
        value: "newAdd"
    }
});
console.log(child)  //{z: "newAdd"}

Object.defineProperties(obj,props)

直接在一個(gè)對(duì)象上定義新的屬性或修改現(xiàn)有屬性锦针,并返回該對(duì)象荠察。

var obj = {};
Object.defineProperties(obj, {
  'property1': {
    value: true,
    writable: true
  },
  'property2': {
    value: 'Hello',
    writable: false
  }
});
console.log(obj)   // {property1: true, property2: "Hello"}

Object.defineProperty(obj,prop,descriptor)

在一個(gè)對(duì)象上定義一個(gè)新屬性,或者修改一個(gè)對(duì)象的現(xiàn)有屬性奈搜, 并返回這個(gè)對(duì)象悉盆。

Object.defineProperty(Object, 'is', {
  value: function(x, y) {
    if (x === y) {
      // 針對(duì)+0 不等于 -0的情況
      return x !== 0 || 1 / x === 1 / y;
    }
    // 針對(duì)NaN的情況
    return x !== x && y !== y;
  },
  configurable: true,
  enumerable: false,
  writable: true 
}); 

不是很清楚這個(gè)和上面那個(gè)的區(qū)別;

Object.keys()

此方法返回一個(gè)數(shù)組馋吗,元素均為對(duì)象自有可枚舉的屬性

let arr = ["a", "b", "c"];
console.log(Object.keys(arr));
// ['0', '1', '2']
 
let obj = { foo: "bar", baz: 42 },
console.log(Object.keys(obj));
// ["foo","baz"] 

Object.values()

方法返回一個(gè)數(shù)組焕盟,元素均為對(duì)象所有可枚舉的屬性值,Object.values會(huì)過濾屬性名為 Symbol 值的屬性。

// array like object with random key ordering
// when we use numeric keys, the value returned in a numerical order according to the keys
var an_obj = { 100: 'a', 2: 'b', 7: 'c' };
console.log(Object.values(an_obj)); // ['b', 'c', 'a']
 
var obj = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.values(obj)); // ['a', 'b', 'c']

Object.entries()

返回一個(gè)數(shù)組脚翘,元素為對(duì)象自身可枚舉屬性的鍵值對(duì)

const obj = { foo: 'bar', baz: 42 };
console.log(Object.entries(obj)); // [ ['foo', 'bar'], ['baz', 42] ]
 
const simuArray = { 0: 'a', 1: 'b', 2: 'c' };
console.log(Object.entries(simuArray)); // [ ['0', 'a'], ['1', 'b'], ['2', 'c'] ]

Object .hasOwnProperty()

方法會(huì)返回一個(gè)布爾值灼卢,指示對(duì)象自身屬性中是否具有指定的屬 obj.hasOwnProperty('name')

Object.getOwnPropertyDescriptor(obj,prop)

返回指定對(duì)象上一個(gè)自有屬性對(duì)應(yīng)的屬性描述符。(自有屬性指的是直接賦予該對(duì)象的屬性来农,不需要從原型鏈上進(jìn)行查找的屬性).

如果指定的屬性存在于對(duì)象上鞋真,則返回其屬性描述符對(duì)象(property descriptor),否則返回 undefined沃于。

var arr = ['name','age'] ;
arr.forEach(val => console.log(Object.getOwnPropertyDescriptor(obj,val)))


// {value: "js", writable: true, enumerable: true, configurable: true}
// undefined

Object.getOwnPropertyDescriptors(obj)

獲取一個(gè)對(duì)象的所有自身屬性的描述符涩咖。

var obj = {
    name : 'js',
    age : 20
}
console.log(Object.getOwnPropertyDescriptors(obj))

//{
//   "name":
//   {
//     "value": "js",
//     "writable": true,
//     "enumerable": true,
//     "configurable": true
//   },
//   "age":
//   {
//     "value": 20,
//     "writable": true,
//     "enumerable": true,
//     "configurable": true
//   }
// }

const source = {
  set foo(value) {
    console.log(value);
  }
};
 
const target2 = {};
Object.defineProperties(target2, Object.getOwnPropertyDescriptors(source));
Object.getOwnPropertyDescriptor(target2, 'foo')
 
 
const obj = Object.create(
  some_obj,
  Object.getOwnPropertyDescriptors({
    foo: 123,
  })
);

Object.getOwnPropertyNames()

返回一個(gè)數(shù)組,元素為對(duì)象的所有自身屬性的屬性名(包括不可枚舉屬性但不包括Symbol值作為名稱的屬性)繁莹。

var obj = { 0: "a", 1: "b", 2: "c"};
 
Object.getOwnPropertyNames(obj).forEach(function(val) {
  console.log(val);
});
 
 
var obj = {
    x : 1,
    y : 2
}
 
Object.defineProperty(obj,'z',{
    enumerable : false
})
console.log(Object.getOwnPropertyNames(obj))  // ["x", "y", "z"] 包含不可枚舉屬性 檩互。
console.log(Object.keys(obj))                 // ["x", "y"]      只包含可枚舉屬性 。

Object.getOwnPropertySymbols()

返回一個(gè)給定對(duì)象自身的所有 Symbol 屬性的數(shù)組咨演。

Object.getPrototypeOf()

返回指定對(duì)象的原型(內(nèi)部[[Prototype]]屬性的值闸昨,即proto,而非對(duì)象的prototype)薄风。

isPrototypeOf()

判斷一個(gè)對(duì)象是否存在于另一個(gè)對(duì)象的原型鏈上饵较。

Object.setPrototypeOf(obj,prototype)

設(shè)置對(duì)象的原型對(duì)象

Object.is()

判斷兩個(gè)值是否相同。

Object.freeze()

凍結(jié)一個(gè)對(duì)象村刨,凍結(jié)指的是不能向這個(gè)對(duì)象添加新的屬性告抄,不能修改其已有屬性的值撰茎,不能刪除已有屬性嵌牺,以及不能修改該對(duì)象已有屬性的可枚舉性、可配置性龄糊、可寫性逆粹。也就是說,這個(gè)對(duì)象永遠(yuǎn)是不可變的炫惩。該方法返回被凍結(jié)的對(duì)象僻弹。

var obj = {
  prop: function() {},
  foo: 'bar'
};
 
// 新的屬性會(huì)被添加, 已存在的屬性可能
// 會(huì)被修改或移除
obj.foo = 'baz';
obj.lumpy = 'woof';
delete obj.prop;
 
// 作為參數(shù)傳遞的對(duì)象與返回的對(duì)象都被凍結(jié)
// 所以不必保存返回的對(duì)象(因?yàn)閮蓚€(gè)對(duì)象全等)
var o = Object.freeze(obj);
 
o === obj; // true
Object.isFrozen(obj); // === true
 
// 現(xiàn)在任何改變都會(huì)失效
obj.foo = 'quux'; // 靜默地不做任何事
// 靜默地不添加此屬性
obj.quaxxor = 'the friendly duck';
console.log(obj)

Object.isFrozen()

凍結(jié)一個(gè)對(duì)象,凍結(jié)指的是不能向這個(gè)對(duì)象添加新的屬性他嚷,不能修改其已有屬性的值蹋绽,不能刪除已有屬性,以及不能修改該對(duì)象已有屬性的可枚舉性筋蓖、可配置性卸耘、可寫性。也就是說粘咖,這個(gè)對(duì)象永遠(yuǎn)是不可變的蚣抗。該方法返回被凍結(jié)的對(duì)象。

var obj = {
  prop: function() {},
  foo: 'bar'
};
 
// 新的屬性會(huì)被添加, 已存在的屬性可能
// 會(huì)被修改或移除
obj.foo = 'baz';
obj.lumpy = 'woof';
delete obj.prop;
 
// 作為參數(shù)傳遞的對(duì)象與返回的對(duì)象都被凍結(jié)
// 所以不必保存返回的對(duì)象(因?yàn)閮蓚€(gè)對(duì)象全等)
var o = Object.freeze(obj);
 
o === obj; // true
Object.isFrozen(obj); // === true
 
// 現(xiàn)在任何改變都會(huì)失效
obj.foo = 'quux'; // 靜默地不做任何事
// 靜默地不添加此屬性
obj.quaxxor = 'the friendly duck';
console.log(obj)

Object.isFrozen()

判斷一個(gè)對(duì)象是否被凍結(jié) .

Object.preventExtensions()

對(duì)象不能再添加新的屬性瓮下『舱。可修改钝域,刪除現(xiàn)有屬性,不能添加新屬性锭魔。

var obj = {
    name :'lilei',
    age : 30 ,
    sex : 'male'
}
 
obj = Object.preventExtensions(obj);
console.log(obj);    // {name: "lilei", age: 30, sex: "male"}
obj.name = 'haha';
console.log(obj)     // {name: "haha", age: 30, sex: "male"}
delete obj.sex ;
console.log(obj);    // {name: "haha", age: 30}
obj.address  = 'china';
console.log(obj)     // {name: "haha", age: 30}

Object.isExtensible()

判斷對(duì)象是否是可擴(kuò)展的例证,Object.preventExtensionsObject.sealObject.freeze 方法都可以標(biāo)記一個(gè)對(duì)象為不可擴(kuò)展(non-extensible)

Object.seal()

**Object.seal()** 方法可以讓一個(gè)對(duì)象密封迷捧,并返回被密封后的對(duì)象战虏。密封一個(gè)對(duì)象會(huì)讓這個(gè)對(duì)象變的不能添加新屬性,且所有已有屬性會(huì)變的不可配置党涕。屬性不可配置的效果就是屬性變的不可刪除烦感,以及一個(gè)數(shù)據(jù)屬性不能被重新定義成為訪問器屬性,或者反之膛堤。但屬性的值仍然可以修改手趣。嘗試刪除一個(gè)密封對(duì)象的屬性或者將某個(gè)密封對(duì)象的屬性從數(shù)據(jù)屬性轉(zhuǎn)換成訪問器屬性,結(jié)果會(huì)靜默失敗或拋出TypeError 異常. 不會(huì)影響從原型鏈上繼承的屬性肥荔。但 [proto](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/proto "Object.prototype 的 __proto__ 屬性是一個(gè)訪問器屬性(一個(gè)getter函數(shù)和一個(gè)setter函數(shù)), 暴露了通過它訪問的對(duì)象的內(nèi)部[[Prototype]] (一個(gè)對(duì)象或 null)绿渣。") ( ) 屬性的值也會(huì)不能修改。

var obj = {
    prop: function () {},
    foo: "bar"
  };
 
// 可以添加新的屬性,已有屬性的值可以修改,可以刪除
obj.foo = "baz";
obj.lumpy = "woof";
delete obj.prop;
 
var o = Object.seal(obj);
 
assert(o === obj);
assert(Object.isSealed(obj) === true);
 
// 仍然可以修改密封對(duì)象上的屬性的值.
obj.foo = "quux";
 
// 但你不能把一個(gè)數(shù)據(jù)屬性重定義成訪問器屬性.
Object.defineProperty(obj, "foo", { get: function() { return "g"; } }); // 拋出TypeError異常
 
// 現(xiàn)在,任何屬性值以外的修改操作都會(huì)失敗.
obj.quaxxor = "the friendly duck"; // 靜默失敗,新屬性沒有成功添加
delete obj.foo; // 靜默失敗,屬性沒有刪除成功
 
// ...在嚴(yán)格模式中,會(huì)拋出TypeError異常
function fail() {
  "use strict";
  delete obj.foo; // 拋出TypeError異常
  obj.sparky = "arf"; // 拋出TypeError異常
}
fail();
 
// 使用Object.defineProperty方法同樣會(huì)拋出異常
Object.defineProperty(obj, "ohai", { value: 17 }); // 拋出TypeError異常
Object.defineProperty(obj, "foo", { value: "eit" }); // 成功將原有值改變

Object.isSealed()

判斷一個(gè)對(duì)象是否被密封

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末燕耿,一起剝皮案震驚了整個(gè)濱河市中符,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌誉帅,老刑警劉巖淀散,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蚜锨,居然都是意外死亡档插,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門亚再,熙熙樓的掌柜王于貴愁眉苦臉地迎上來郭膛,“玉大人,你說我怎么就攤上這事氛悬≡蛱辏” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵如捅,是天一觀的道長(zhǎng)棍现。 經(jīng)常有香客問我,道長(zhǎng)伪朽,這世上最難降的妖魔是什么轴咱? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上朴肺,老公的妹妹穿的比我還像新娘窖剑。我一直安慰自己,他們只是感情好戈稿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布西土。 她就那樣靜靜地躺著,像睡著了一般鞍盗。 火紅的嫁衣襯著肌膚如雪需了。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天般甲,我揣著相機(jī)與錄音肋乍,去河邊找鬼。 笑死敷存,一個(gè)胖子當(dāng)著我的面吹牛墓造,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播锚烦,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼觅闽,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了涮俄?” 一聲冷哼從身側(cè)響起蛉拙,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎彻亲,沒想到半個(gè)月后孕锄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡睹栖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年硫惕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片野来。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖踪旷,靈堂內(nèi)的尸體忽然破棺而出曼氛,到底是詐尸還是另有隱情,我是刑警寧澤令野,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布舀患,位于F島的核電站,受9級(jí)特大地震影響气破,放射性物質(zhì)發(fā)生泄漏聊浅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望低匙。 院中可真熱鬧旷痕,春花似錦、人聲如沸顽冶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)强重。三九已至绞呈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間间景,已是汗流浹背佃声。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留倘要,地道東北人秉溉。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像碗誉,于是被迫代替她去往敵國(guó)和親召嘶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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

  • 概述 JavaScript 原生提供Object對(duì)象哮缺。JavaScript 的所有其他對(duì)象都繼承自O(shè)bject對(duì)象...
    oWSQo閱讀 275評(píng)論 0 1
  • 首先一個(gè)是對(duì)JS中Object的理解:JavaScript中函數(shù)是一等公民弄跌,寫在代碼中的 Array/Object...
    皮皮坤666閱讀 1,685評(píng)論 0 3
  • js API1.全局對(duì)象NAN 非數(shù)字值的特殊值infinity 代表正無(wú)窮的數(shù)據(jù)undefined 2.函數(shù)屬性...
    Aa劉德健閱讀 1,654評(píng)論 0 2
  • 概述 JavaScript 原生提供Object對(duì)象(注意起首的O是大寫),本章介紹該對(duì)象原生的各種方法尝苇。 Jav...
    許先生__閱讀 469評(píng)論 0 3
  • 1 概述 JavaScript 的所有其他對(duì)象都繼承自O(shè)bject對(duì)象铛只,即那些對(duì)象都是Object的實(shí)例。 Obj...
    徵羽kid閱讀 282評(píng)論 0 0