1. 程式人生 > 其它 >object 常用方法總結

object 常用方法總結

Object常用方法總結:
1.Object.assign(target,source1,source2,...)
該方法主要用於物件的合併,將源物件source的所有可列舉屬性合併到目標物件target上,此方法只拷貝源物件的自身屬性,不拷貝繼承的屬性。
Object.assign方法實行的是淺拷貝,而不是深拷貝。也就是說,如果源物件某個屬性的值是物件,那麼目標物件拷貝得到的是這個物件的引用。同名屬性會替換。
Object.assign只能進行值的複製,如果要複製的值是一個取值函式,那麼將求值後再複製。
Object.assign可以用來處理陣列,但是會把陣列視為物件。

const target = { x : 0,y : 1};
const source = { x : 1,z : 2 ,fn : {number : 1}};
console.log(Object.assign(target, source));
// target {x : 1, y : 1, z : 2, fn : {number : 1}} // 同名屬性會被覆蓋
target.fn.number = 2;
console.log(source)// source {x : 1, z : 2, fn : {number : 2}} // 拷貝為物件引用

function Person(){
this.name = 1
};
Person.prototype.country = 'china';
var student = new Person();
student.age = 29 ;
const young = {name : 'zhang'};
Object.assign(young,student);
// young {name : 'zhang', age : 29} // 只能拷貝自身的屬性,不能拷貝prototype

Object.assign([1, 2, 3], [4, 5]) // 把陣列當作物件來處理
// [4, 5, 3]

2.Object.create(prototype,[propertiesObject])

使用指定的原型物件及其屬性去建立一個新的物件

var parent = { x : 1,y : 1}
var child = Object.create(parent,{
z : { // z會成為建立物件的屬性
writable:true,
configurable:true,
value: "newAdd"
}
});
console.log(child) //{z:"newAdd"}
console.log(child.x) //1

3.Object.defineProperties(obj,props)
直接在一個物件上定義新的屬性或修改現有屬性,並返回該物件。
var obj = {};
Object.defineProperties(obj, {
'property1': {
value: true,
writable: true
},
'property2': {
value: 'Hello',
writable: false
}
});
console.log(obj) // {property1: true, property2: "Hello"}

4.Object.defineProperty(obj,prop,descriptor)

在一個物件上定義一個新屬性,或者修改一個物件的現有屬性, 並返回這個物件。

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

// 注意不能同時設定(writable,value) 和 get,set方法,否則瀏覽器會報錯 : Invalid property descriptor. Cannot both specify accessors and a value or writable attribute

5.Object.keys(obj)

返回一個由一個給定物件的自身可列舉屬性組成的陣列,陣列中屬性名的排列順序和使用 for...in 迴圈遍歷該物件時返回的順序一致 (兩者的主要區別是 一個 for-in 迴圈還會列舉其原型鏈上的屬性)。

var arr = ["a", "b", "c"];
console.log(Object.keys(arr));
// ['0', '1', '2']

/* Object 物件 */
var obj = { foo: "bar", baz: 42 },
keys = Object.keys(obj);
console.log(keys);
// ["foo","baz"]

6.Object.values()
方法返回一個給定物件自己的所有可列舉屬性值的陣列,值的順序與使用for...in迴圈的順序相同 ( 區別在於 for-in 迴圈列舉原型鏈中的屬性 )。
Object.values會過濾屬性名為 Symbol 值的屬性。

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']

7.Object.entries()
返回一個給定物件自身可列舉屬性的鍵值對陣列,其排列與使用 for...in 迴圈遍歷該物件時返回的順序一致(區別在於 for-in 迴圈也列舉原型鏈中的屬性)。

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'] ]

8.hasOwnProperty()
判斷物件自身屬性中是否具有指定的屬性。
obj.hasOwnProperty('name')

9.Object.getOwnPropertyNames()
返回一個由指定物件的所有自身屬性的屬性名(包括不可列舉屬性但不包括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"] 只包含可列舉屬性 。

10.isPrototypeOf()
判斷一個物件是否存在於另一個物件的原型鏈上。

11.Object.setPrototypeOf(obj,prototype)
設定物件的原型物件

12.Object.is()
判斷兩個值是否相同。
如果下列任何一項成立,則兩個值相同:

兩個值都是 undefined
兩個值都是 null
兩個值都是 true 或者都是 false
兩個值是由相同個數的字元按照相同的順序組成的字串
兩個值指向同一個物件
兩個值都是數字並且
都是正零 +0
都是負零 -0
都是 NaN
都是除零和 NaN 外的其它同一個數字
Object.is('foo', 'foo'); // true
Object.is(window, window); // true

Object.is('foo', 'bar'); // false
Object.is([], []); // false

var test = { a: 1 };
Object.is(test, test); // true

Object.is(null, null); // true

// 特例
Object.is(0, -0); // false
Object.is(-0, -0); // true
Object.is(NaN, 0/0); // true

13.Object.freeze()
凍結一個物件,凍結指的是不能向這個物件新增新的屬性,不能修改其已有屬性的值,不能刪除已有屬性,以及不能修改該物件已有屬性的可列舉性、可配置性、可寫性。也就是說,這個物件永遠是不可變的。該方法返回被凍結的物件。

var obj = {
prop: function() {},
foo: 'bar'
};

// 新的屬性會被新增, 已存在的屬性可能
// 會被修改或移除
obj.foo = 'baz';
obj.lumpy = 'woof';
delete obj.prop;

// 作為引數傳遞的物件與返回的物件都被凍結
// 所以不必儲存返回的物件(因為兩個物件全等)
var o = Object.freeze(obj);

o === obj; // true
Object.isFrozen(obj); // === true

// 現在任何改變都會失效
obj.foo = 'quux'; // 靜默地不做任何事
// 靜默地不新增此屬性
obj.quaxxor = 'the friendly duck';
console.log(obj)

14.Object.isFrozen()
判斷一個物件是否被凍結 .

15.Object.preventExtensions()
物件不能再新增新的屬性。可修改,刪除現有屬性,不能新增新屬性。

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}