JavaScript中Object标准库的静态方法和实例方法

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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值