1. 概述
javaScript中万物皆对象,所有的对象的根源都是Object
Array.prototype.__proto__ === Object.prototype; //true
String.prototype.__proto__ === Object.prototype; //true
Boolean.prototype.__proto__ === Object.prototype; //true
2. Object()方法
Object对象本身也是一个方法,接收一个参数将它转换为对象类型
如果省略参数或者传入的参数为null和undefined则返回一个空对象
Object(); //{}
Object(null); //{}
Object(undefined); //{}
如果传入的参数是原始数据类型,则返回对应的包装类型
Object(1);
//Number {1}
Object('str');
//String {'str'}
如果传入的是一个对象类型则不做处理
const user = {name:'ian'};
const obj = Object(user);
user === obj; //true
3. 构造函数
Object还可以当作构造函数使用,使用new操作符生成一个新的对象
const obj = new object();
//等同于
const obj = {};
new Object()和Object()用法基本相同,返回的也是一个基础数据类型的包装类型,唯一的区别是Object每次new Object()每次都返回一个新的对象。
4. Object的静态方法
-
对象key相关
- Object.keys()
- Object.getOwnPropertyNames()
-
对象模型相关
- Object.defineProperty()
- Object.defineProperties()
- Object.getOwnDescriptor()
- Object.getOwnDescriptors()
-
控制对象状态的方法
- Object.preventExtensions() 防止对象拓展
- Obejct.isExtensible()
- Object.seal() 禁止配置对象
- Object.isSealed() 判断对象是否可配置
- Object.freeze() 冻结对象
- Object.isFrozen() 判断对象是否冻结
-
原型链相关的方法
- Object.create()
- Object.getPrototypeOf()
- Object.setPrototypeOf()
-
其它
- Obejct.assign()
4.1 Object.keys()、Object.getOwnPropertyNames()
Object.keys()和Object.getOwnPropertNames()都用来获取对象自身的(不包含继承来的)key,以数组的形式返回,两者获取的key的顺序是一致的,唯一的区别是Object.keys()只能获取可枚举的key,Object.getOWnPropertyNames()获取的是可枚举的和不可枚举的key。
const user = { name: 'ian', age: 21, gender: 'male' };
Object.defineProperty(user, 'hobby', {
value: 'arunning'
});
Object.keys(user);
//[ "name", "age", "gender" ]
Object.getOwnPropertyNames(user);
// [ "name", "age", "gender", "hobby" ]
4.2 Object.defineProperty()和Object.defineProperties()
JS提供了属性描述符(descriptor)用于描述一个对象的属性,属性描述符就是一个数据结构
{
value: 'str', //对象的值
writable: fasle, //对象的属性
enumerable: false, //是否可枚举
configurable: false, //属性描述符是否可以重新配置
}
//等同于
{
enumerable: false,
configurable: false,
set:function(value){
return value;
},
get:function(key){
return obj[key];
}
}
使用Object.defineProperty()定义对象属性
const obj = Object.defineProperty({name:'ian'},gender:{
value: 'male',
writable: false,
enumerable: true,
configurable: false,
});
obj; //{name:'ian', gender:'nale'};
使用Object.defineProperties()定义多个属性
const user = {name:'ian', age:23};
Object.defineProperty(user,{
name:{
value: 'jack',
writable: false,
enumerable: true,
configurable: false,
},
age:{
value: 20,
writable: false,
enumerable: true,
configurable: false,
}
});
obj; //{name:'jack', age:20};
object.defineProperty相关: Object.defineProperty和proxy代理模式
4.3 Obejct.create()
Object(prop, descriptors)接收一个对象作为原型创建一个新的对象,第二个参数为新建的对象添加一些属性
- prop将属性添加到原型上
- descriptors将属性添加到对象本身
const obj = { name: 'ian' };
const user = Object.create(obj, { age: { value: 21 } });
console.log(user); //{age: 21}
const user = { name: 'ian', age: 21, gender: 'male' };
Object.hasOwnProperty(user, 'name'); //true
Object.hasOwnProperty(user, 'hobby'); //false
4.4 Object.getPrototypeOf()
Object.getPrototypeOf()用来判断对象的原型
const obj = { name: 'ian', age: 21 };
const obj1 = Object.create(obj);
Object.getPrototypeOf(obj1);
//{name:'ian',age:21}
Object.getPrototypeOf(obj1) === obj;
//true
4.5 Object.freeze()、Object.isForzen()
Object.freeze()方法可以冻结一个对象,被冻结的对象不可再进行任何修改,不能添加、修改、删除属性,属性的描述符也不能修改,冻结后原型也不能修改,
Object.freeze()的返回值是传入的对象。
const user = { name: 'ian' };
Object.freeze(user);
delete user.name;
//false
user.name = 'jack';
user.name;
//ian
user.age = 21;
user.age;
//undeined
Obejct.defineProperty(user, 'name', {
writable: true
});
//ncaught TypeError: Cannot redefine property: name
Object.isForzen()判断一个对象是否被冻结
const user = { name: 'ian' };
Object.freeze(user);
Object.isFrozen(user);
//true
4.6 Object.seal()、Object.isSealed()
Object.seal()方法封闭一个对象,禁止添加新属性并将现有属性设置为不可配置,当前属性值只要原来是可写的就可以改变
const user = {name: 'ian'};
Object.seal(user);
//等同于
Object.defineProperty(user,'name',{
configurable: false
});
Object.age = 21;
user.age; //undefined
user.name = 'jack';
user.name; //jack
Object.isSealed()判断一个对象是否被封闭
const user = {name: 'ian'};
Object.seal(user);
Obejct.isSealed(user); //true
4.7 Object.preventExtension()、Object.isExtensible()
Obejct.preventExtensions()方法设置对象不可拓展,即对象不能添加新属性,但原型上仍然能添加新属性,且原型不可被修改。
function Person(name) {
this.name = name;
};
const jack = new Person('jack'); // Person {name: 'jack'}
Object.preventExtensions(jack)
//无法新增属性
jack.age = 21;
console.log(jack.age); //undefined
//在原型上新增属性
Person.prototype.age = 21;
console.log(jack.age); //21
//原型不可被修改
Object.setPrototypeOf(jack, {}); //#<Person> is not extensible
Object.isExtensible()方法判断一个对象是否不可拓展
const user = {};
Object.preventExtensions(user);
Object.isExtensible(user); //false
5. Object的实例方法
- Object.prototype.valueOf()
- Object.prototype.toString()
- Object.prototype.toLocalString()
- Object.prototype.hasOwnProperty()
- Object.prototype.isPrototypeOf()
- Object.prototype.propertyIsEnumerable()
5.1 Object.protoType.valueOf()、Object.prototype.ToString()
Object.prototype.valueOf()返回对象的值,默认返回对象本身,Object.prototype.toString()返回对象的字符类型,对象类型的数据在与字符串相加的时候会鲜榨先转为原始类型,转换规则是先调用valueOf方法再调用toString方法。
5.2 Object.prototype.toLocalString()
toLocalString与localString类似,也是将一个数据类型转成字符串,通常它的返回结果和toString是一致的,to
LocalString的作用是让不同类型的数据实现自己的localString,例如对于Date类型的数据toLocalString和toString返回的结果就有所区别,toLocalString返回的是针对某些地域的时间格式
const date = new Date();
date.toString();
//Tue Sep 27 2022 09:06:40 GMT+0800 (中国标准时间)
date.toLocalString();
//2022/9/27 09:06:40
5.3 Object.prototype.hasOwnProperty()
Object.prototype.hasOwnProperty()方法判断对象自身是否具有某个属性,返回布尔值
function Person(name){
this.name = name;
};
Person.prototype.age = 21;
const jack = new Person('jack');
jack.hasOwnProperty('name'); //true
jack.hasOwnProperty('age'); //false
5.4 Object.prototype.isPropertyOf()
Object.prototype.isPrototypeOf()方法用来测试一个对象是否在另一个对象的原型链上
function Person(name){
this.name = name;
};
const jack = new Person('jack');
Person.prototype.isPrototypeOf(jack);
//true
5.5 Object.prototype.propertyIsEnumerable()
该方法用来判断对象的某个属性是否可枚举,返回一个布尔值
const user = {name:'jack'};
Object.defineProperty(user,'age',{
value: 21
});
user.propertyIsEnumerable('name'); //true
user.propertyIsEnumerable('age'); //false