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.preventExtensions
,Object.seal
或 Object.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ì)象是否被密封