JavaScript中对象(Object)的方法

Object.getPrototypeOf方法返回参数对象的原型。这是获取原型对象的标准方法。

代码示例:


    var F = function () {};

    var f = new F();

    Object.getPrototypeOf(f) === F.prototype // true

  几种特殊对象的方法:

    // 空对象的原型是 Object.prototype

    Object.getPrototypeOf({}) === Object.prototype // true



    // Object.prototype 的原型是 null

    Object.getPrototypeOf(Object.prototype) === null // true



    // 函数的原型是 Function.prototype

    function fun() {}

    Object.getPrototypeOf(fun) === Function.prototype // true



2、Object.setPrototypeOf(nowObject,originalObject)


Object.setPrototypeOf 方法为参数对象设置原型,返回该参数对象。它接受两个参数,第一个是现有对象,第二个是原型对象。

方法和new出来的对象类似

代码示例:


    var a = {};

    var b = {x: 1};

    Object.setPrototypeOf(a, b);



    Object.getPrototypeOf(a) === b // true

    a.x // 1



3、Object.create(Object)


Object.create()方法接受一个对象为参数,然后以它为原型,返回一个实例对象。该实例完全继承原型对象的属性、方法

代码示例:


 // 原型对象

      var A = {

        print: function () {

          console.log('hello');

        }

      };



      // 实例对象

      var B = Object.create(A); //通过对象上的create方法,B继承拥有了A的属性以及方法



      Object.getPrototypeOf(B) === A // true

      B.print() // hello

      B.print === A.print // true





注意:

1、create方法必须提供对象原型,参数为空或者参数不是对象,代码会报错

2、create()方法生成的新对象,动态继承了原型。在原型上添加或修改任何方法,会立刻反映在新 对象之上。相当于浅拷贝

实例对象的方法:


1、Object.prototype.isPrototypeOf()


实例对象的isPrototypeOf方法,用来判断该对象是否为参数对象的原型。

示例代码:


console.log(Object.prototype.isPrototypeOf({})) // true

console.log(Object.prototype.isPrototypeOf([])) // true

console.log(Object.prototype.isPrototypeOf(/xyz/)) // true

console.log(Object.prototype.isPrototypeOf(Object.create(null))) // false



上面代码中,由于Object.prototype处于原型链的最顶端,所以对各种实例都返回true,只有直接继承自null的对象除外。

2、Object.getOwnPropertyNames()


Object.getOwnPropertyNames方法返回一个数组,成员是参数对象本身的所有属性的键名,不包含继承的属性键名。

示例代码:


    console.log(Object.getOwnPropertyNames(Date))

  // [ 'length', 'name', 'prototype', 'now', 'parse', 'UTC' ]



3、Object.prototype.hasOwnProperty()


对象实例的hasOwnProperty方法返回一个布尔值,用于判断某个属性定义在对象自身,还是定义在原型链上。

示例代码:


    Date.hasOwnProperty('length') // true

    Date.hasOwnProperty('toString') // false



4、in 运算符和 for…in 循环


in运算符返回一个布尔值,表示一个对象是否具有某个属性。它不区分该属性是对象自身的属性,还是继承的属性。

示例代码:


 'length' in Date // true

 'toString' in Date // true

 //in运算符常用于检查一个属性是否存在。



 //获得对象的所有可遍历属性(不管是自身的还是继承的),可以使用for...in循环。



      var o1 = { p1: 123 };



      var o2 = Object.create(o1, {

        p2: { value: "abc", enumerable: true }

      });



      for (p in o2) {

        console.info(p); //p1 p2

      }  



ES6新增:


1、 Object.is()


Object.is用来比较两个值是否严格相等,与严格比较运算符(===)的行为基本一致。


let a = {major:'英语',class:'五年一班'};

let aClone = { ...a };//使用扩展运算符将对象a的数据复制到aClone1中

console.log(aClone === a); //false

console.log(Object.is(aClone,a)) //false,使用对象上的is进行判断是否相同



2、Object.assign()


Object.assign()方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。

Object.assign()方法的第一个参数是目标对象,后面的参数都是源对象。


const target = { a: 1 };

const source1 = { b: 2 };

const source2 = { c: 3,d:4 };

Object.assign(target, source1, source2);

console.log(target);// { a: 1, b: 2, c: 3, d: 4 }

const source = { a: { b: 'hello' } }

let obj = Object.assign(target, source)

console.log(obj) //  { a: { b: 'hello' }} key相同时,后出现的value将会覆盖前边的value值




注意:

  1、如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性。

  2、Object.assign()方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,

  那么目标对象拷贝得到的是这个对象的引用。



3、Object.getOwnPropertyDescriptors()


ES2017 引入了Object.getOwnPropertyDescriptors()方法,返回指定对象所有自身属性(非继承属性)的描述对象


const obj = {

  id:123,

  get bar(){return 'abc'}

};

let obj1 = Object.getOwnPropertyDescriptors(obj)

console.log(obj1)



输出结果:


{

  id: { value: 123, writable: true, enumerable: true, configurable: true },

  bar: {

    get: [Function: get bar],

    set: undefined,

    enumerable: true,

    configurable: true

  }

}



4、Object.setPrototypeOf()


Object.setPrototypeOf方法的作用与__proto__相同,用来设置一个对象的原型对象(prototype) 返回参数对象本身。它是 ES6 正式推荐的设置原型对象的方法。

语法格式:

Object.setPrototypeOf(object, prototype)

语法示例:

const o = Object.setPrototypeOf({}, null);

举例:


let proto = {};

let obj = {x:10};

Object.setPrototypeOf(obj,proto)

proto.y = 20;

proto.z = 30;

console.log(obj.x) //10

console.log(obj.y) //20

console.log(obj.z) //30

console.log(proto) //{ y: 20, z: 30 }



5、Object.getPrototypeOf()


Object.getPrototypeOf,该方法与Object.setPrototypeOf配套,用于查询读取一个对象的原型对象

语法格式:

Object.getPrototypeOf(obj);


function Rectangle() {

  // ...

}



const rec = new Rectangle();



console.log(Object.getPrototypeOf(rec) === Rectangle.prototype);

//输出true 表明rec对象的原型对象和Rectangle的原型对象是一致的

Object.setPrototypeOf(rec, Object.prototype); //将rec的原型对象设置到Object的原型对象上面

console.log(Object.getPrototypeOf(rec) === Rectangle.prototype)

//输出false,表明rec的原型对象重新设置后与Rectangle的原型对象不一样了



6、Object.keys(),Object.values(),Object.entries()


这三个方法都是将对象中的键或者值转换成数组可供遍历。ES2017 引入了跟Object.keys配套的Object.values和Object.entries,作为遍历一个对象的补充手段,供for…of循环使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值