关于Object的方法

1. Object.assign(target,source1,source2,…)

将源对象(source1,source2...)的所有可枚举属性,复制到目标对象(target)中,第一个参数是目标对象,后面的参数都是源对象;

const target = {a:1,b:2};
const source1 = {b:3,c:4};
const source2 = {e:{f:5}};

const obj = Object.assign(target,source1,source2);
console.log(obj); //{a: 1, b: 3, c: 4, e: {f: 5}}
source2.e.f = 6;
console.log(obj); //{a: 1, b: 3, c: 4, e: {f: 6}}

根据上方代码我们可以得知这个方法的两个特点:

  1. 同名属性会被替换,后面替换前面,source1中的b:3覆盖了target中的b:2;
  2. 属于浅拷贝,也就是引用地址,因此我们改的是source2中f的值,但是打印obj,也同步被改变了;如果直接复制上方代码打印结果,会发现两次obj打印的结果其实是一样的,都是f:6,也可证明引用的是地址;
const target1 = {a:1,b:2};
const target2 = [1,2,3];
const source2 = [4,5];

let obj1 = Object.assign(target1);
console.log(obj1); //{a: 1, b: 2}
let obj2 = Object.assign(target2,source2);
console.log(obj2); //[4, 5, 3]

根据上方代码我们还可以得知该方法的两个特点:

  1. 如果只有target对象,则直接返回该对象;
  2. 如果使用方法的是数组,则转化成对象,位置作为键,因此就变成了同位置覆盖,source2中的4,5覆盖了target2中的1,2;

2. Object.create(proto)

create方法为创建一个新对象,但是是使用现有的对象来提供新创建的对象的proto(原型)

const obj1 = {
            a: false,
            say: function () {
                console.log(this.a);
            }
        };

        const obj2 = Object.create(obj1);
        obj2.a = true;
        obj2.say(); //true

根据上方代码可见,我们按照obj1的样子创建了obj2,我们修改了obj2中a的布尔值,并调用obj2中的say方法,打印a的布尔值。

3. Object.defineProperty()

该方法的作用是给对象添加一个属性并指定该属性的配置

const object1 = {};
Object.defineProperty(object1, 'property1', {
  value: 42,
  writable: false
});

object1.property1 = 77;
console.log(object1.property1); //42

用此方法给obj1添加了一个属性property1,设置value为42且设置writable: false,不可改写,其他的配置关键字如下:

  1. configurable:当且仅当该属性的 configurable 键值为 true 时,该属性的描述符才能够被改变,同时该属性也能从对应的对象上被删除。 默认为 false

  2. enumerable:当且仅当该属性的 enumerable 键值为 true 时,该属性才会出现在对象的枚举属性中。 默认为 false

数据描述符还具有以下可选键值:

  1. value:该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。 默认为 [undefined]

  2. writable:当且仅当该属性的 writable 键值为 true 时,属性的值,也就是上面的 value,才能被赋值运算符改变。 默认为 false。

4. Object.keys(obj)

返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历(enumerable)属性的键名

const obj1 = {a:1,b:2};
let arr1 = Object.keys(obj1);
console.log(arr1);  //['a', 'b']
const obj2 = {c:1,d:2};
Object.defineProperty(obj2,'e',{
    value:3,
    enumerable:false //不用写也行,默认false
})
let arr2 = Object.keys(obj2);
console.log(obj2);//{c: 1, d: 2, e: 3}
console.log(arr2);//[['c', 'd']]

根据Object.defineProperty()我们可以设置不能被枚举的数组,就不会出现在该方法返回的数组中了,例如obj2打印出来是有e属性的,但是返回可枚举的数组里不包含e

5. obj.hasOwnProperty('attr')

判断对象自身属性中是否具有指定的属性,不包括对象原型链上的方法的,返回boolean

const obj = {
    name:'Frank'
}
console.log(obj.hasOwnProperty('name')); //true
console.log(obj.hasOwnProperty('age')); //false

6. Object.prototype.toString.call( 任意值)

比较准确的检测对象类型

console.log(Object.prototype.toString.call(11));//[object Number]
console.log(Object.prototype.toString.call('Frank'));//[object String]
console.log(Object.prototype.toString.call(true));//[object Boolean]
console.log(Object.prototype.toString.call([]));//[object Array]
console.log(Object.prototype.toString.call({}));//[object Object]
console.log(Object.prototype.toString.call(undefined));//[object Undefined]
console.log(Object.prototype.toString.call(function(){}));//[object Function]

结尾:
个人学习中忽略了Object方法,特此总结,还有更多方法,将会继续补充
仅根据个人学习后的理解整理如上知识点,如有错误,请不吝赐教~

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容