写在前面
JS的对象方法不管是在面试,还是在工作中做项目,亦或者是在了解JS或者JS框架的原理中都非常的重要,本文详细总结了JS中的对象方法,让你做到对它们的用法一网打尽。
食用对象:初级前端
美味指数:😋😋😋😋😋
Object
1. Object.create
Object.create(proto,[propertiesObject]):创建一个对象,第一个参数为新对象的原型对象 第二个参数可配置新对象自身的属性
let obj = Object.create({ a: 1 }, {
b: {
value:2, //属性值
enumerable: true, //是否可枚举
writable: true, //是否可以重写值
configurable: true //是否可以修改以上几项配置
}
})
console.log(obj) //{ b: 2 }
console.log(obj.__proto__); //{ a: 1 }
2.Object.defineProperty(obj, prop, descriptor):
Object.defineProperty(obj, prop, descriptor):
在指定对象上定义一个新属性或者修改一个属性,并进行相应配置,第一个参数为配置的对象,第二个参数为要定义或修改的属性名,第三个属性为属性描述符
- value:属性值
- writable:定义是否可重写,默认为false
- enumerable:定义是否可枚举,默认为false
- configurable:定义描述符是否可以改变,默认为false
- get:属性的getter函数,访问属性时会执行此函数,默认为undefine
- set:属性的setter函数,修改属性时,会调用此函数,默认为undefined
属性描述符分为:数据描述符和存取描述符
- 数据描述符是一个具有值的属性,该值可以是可写的,也可以是不可写的
- 存取描述符是由getter函数和setter函数所描述的属性
如果一个描述符同时拥有 value 或 writable 和 get 或 set 键,则会产生一个异常。
let obj = {};
Object.defineProperty(obj, 'a', {
value: 1,
writable: true, //定义是否可重写
enumerable: true, //定义是否可枚举
configurable: true, //定义是否可配置
})
3. Object.assign
Object.assign(target, ...sources):将一个或多个对象的可枚举属性分配到目标对象,并返回目标对象。
const target = {a: 1};
const obj = Object.assign(target, {b: 3}, {b: 4, c: 5});
console.log(obj); //{ a: 1, b: 4, c: 5 } 注意后面的源对象属性会覆盖前面的
4. Object.freeze
Object.freeze:
- 冻结一个对象,冻结后便不能被修改
- 不能添加新属性,也不能删除属性,不能修改属性描述符,原型也不能修改。
- 但是如果一个属性的值是个对象,则这个对象中的属性是可以修改的,除非它也是个冻结对象,数组作为一种对象,被冻结,其元素不能被修改。没有数组元素可以被添加或移除。
let obj = {
a: 1,
object: {
b: 5,
},
}
Object.freeze(obj);
obj.a = 2;
console.log(obj.a); // 1
obj.object.b = 6
console.log(obj.object) // { b: 6 }
5.Object.getOwnPropertyDescriptor
Object.getOwnPropertyDescriptor:返回指定对象上一个自有属性对应的属性描述符,不能是原型上的。
let obj = { a: 1 };
let des = Object.getOwnPropertyDescriptor(obj, 'a');
console.log(des.value); // 1
console.log(des.writable);// true
6.Object.getOwnPropertyNames
Object.getOwnPropertyNames:返回指定对象自身(不包括原型)所有的属性名(包括可枚举和不可枚举)组成的数组
let obj = {a:1, b:2};
let res = Object.getOwnPropertyNames(obj);
console.log(res); // [ 'a', 'b' ]
7. Object.getPrototypeOf
Object.getPrototypeOf:返回指定对象的原型对象
let obj = {a: 1};
obj.__proto__ = {b:2};
console.log(Object.getPrototypeOf(obj)); // { b: 2 }
8. Object.is
Object.is:比较两个值是否相等,除了NaN,+0和-0之外,其他与===相同
console.log(+0 === -0); //true
console.log(NaN === NaN); //false
console.log(Object.is(+0, -0)); //false
console.log(Object.is(NaN, NaN)); //true
9. Object.seal
Object.seal:密封一个对象,不能添加新属性以及当前属性不可配置,但是属性值得可写性不变
let obj = { a: 1 };
Object.seal(obj);
obj.a = 2;
obj.b = 3;
console.log(obj.a); //2
console.log(obj.b); //undefined
10. Object.preventExtensions
Object.preventExtensions:让一个对象变得不可扩展,不能添加新属性
let obj = { a: 1 };
Object.preventExtensions(obj);
obj.b = 2;
console.log(obj.b) //undefined
11. Object.isExtensible
Object.isExtensible:判断一个对象是否可以扩展
Object.preventExtensions,Object.seal 或 Object.freeze 方法都可以标记一个对象为不可扩展
let obj = { a: 1 };
Object.freeze(obj);
obj.b = 2;
console.log(obj.b); //undefined
12. Object.keys
Object.keys:返回对象自身(不包括原型)可枚举属性组成的数组
let obj = {
name: 'jack',
age: 13,
__proto__: {
address: 'abc',
}
}
console.log(Object.keys(obj)) //[ 'name', 'age' ]
13. Object.values
Object.values:返回对象自身(不包括原型)可枚举属性值组成的数组
let obj = {
name: 'jack',
age: 13,
__proto__: {
address: 'abc',
}
}
console.log(Object.values(obj)) //[ 'jack', 13 ]
14. Object.entries
Object.entries:返回对象自身(不包括原型)可枚举属性的键值对数组
let obj = {
name: 'jack',
age: 13,
__proto__: {
address: 'abc',
}
}
console.log(Object.entries(obj)) //[ [ 'name', 'jack' ], [ 'age', 13 ] ]
感谢阅读
非常感谢您到阅读到最后,如果有错误希望您能够指出,以免误导其他人,如果您觉得对您有帮助的话,希望能够点个赞,加个关注,有任何问题都可以联系我,希望能够一起进步。
最后祝您前程似锦,我们各自攀登,高处相见🌈!