JS Object的静态方法汇总( 上 )

前言

最近在复习js的基础内容,特此做下总结。


以下内容参考MDN

1、Object.defintProperty()

这个方法是用来设置对象属性的一些特性。

语法
Object.defineProperty(obj, prop, descriptor)
复制代码
参数

obj : 要定义或修改属性的对象。

prop : 要定义或修改的属性。

descriptor : 要定义或修改的特性

返回值

被设置后的对象。

关于特性

之前专门有篇文章介绍对象属性的特性。juejin.im/post/5abce3…

示例
let obj = {
    _age: 3
};
<!-- 数据属性 -->
Object.defineProperty(obj, 'name', {
    configurable: false,  // 能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,能否把属性修改为访问器属性。
    enumerable: false, // 能否通过 for-in 循环返回属性。 
    writable: true, // 能否修改属性的值
    value: '张三' // 这个属性的数据值。
})
<!-- 访问器属性 -->
Object.defineProperty(obj, 'age', {
    configurable: true,
    enumerable: true,
    get: function () {   // 读取 age 属性时,会执行这个函数。返回值就是 age 的值。
        return this._age;
    },
    set: function (newValue) { // 写入 age  属性时,会执行这个函数。
        if (newValue > 5) {
            this._age += newValue;
        } else {
            this._age = newValue;
        }
    }
})
复制代码

2、Object.defineProperties()

这个方法跟上面 Object.defineProperty()的作用是一样的。只不过这个方法可以定义多个属性。

示例
let obj = {
    _age: 2
};
Object.defineProperties(obj, {
    name: {
        configurable: false,
        writable: true,
        value: '李四'
    },
    age: {
        get: function () {
            return this._age; 
        },
        set: function (newValue) {
            if (newValue > 5) {
                this._age += newValue;
            } else {
                this._age = newValue;
            }
        }
    }
})
复制代码

3、Object.getOwnPropertyDescriptor()

这个方法可以获取给定属性的特性。

语法
Object.getOwnPropertyDescriptor(obj, prop)
复制代码
参数

obj : 目标所在的对象。

prop : 要获取特性的属性。

返回值

如果给定的属性存在于对象上,则返回属性描述符对象。否则返回 undefined

示例
var o, d;

o = { get foo() { return 17; } };
d = Object.getOwnPropertyDescriptor(o, "foo");
// d {
//   configurable: true,
//   enumerable: true,
//   get: /*the getter function*/,
//   set: undefined
// }

o = { bar: 42 };
d = Object.getOwnPropertyDescriptor(o, "bar");
// d {
//   configurable: true,
//   enumerable: true,
//   value: 42,
//   writable: true
// }

o = {};
Object.defineProperty(o, "baz", {
  value: 8675309,
  writable: false,
  enumerable: false
});
d = Object.getOwnPropertyDescriptor(o, "baz");
// d {
//   value: 8675309,
//   writable: false,
//   enumerable: false,
//   configurable: false
// }
复制代码

4、Object.getOwnPropertyDescriptors()

这个方法,用来获取一个对象所有自身属性的特性描述符。

语法
Object.getOwnPropertyDescriptors(obj)
复制代码
参数

obj : 要获取的目标对象。

返回值

所指定的对象的所有自身属性的特性描述符,如果没有任何自身属性则返回空对象。

示例
  • 浅拷贝一个对象
    Object.assign()方法只能拷贝源对象的可枚举的自身属性,同时拷贝时无法拷贝属性的特性们,而且访问器属性会被转为数据属性,也无法拷贝源对象的原型。利用Object.getOwnPropertyDescriptors()配合 Object.create()可以实现上面说的这些。
    Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));
    <!-- 演示 -->
    let obj = {
        width: '200',
        height: '200',
        color: 'red',
        arr: ['one', 'two'],
        sayWidth: function () {
            console.log('我的width:', this.width);
        }
    }
    let obj1 = Object.create(obj);
    let obj2 = Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));
    console.log('Obj1:', obj1); 
    //'Obj1:' {}  <!-- obj对象的属性和方法都添加到 obj1 的原型对象上了。-->
    
    console.log('Obj2:', obj2);
    //'Obj2:' {
    //    width: '200',
    //    height: '200',
    //    color: 'red',
    //    arr: ['one', 'two'],
    //    sayWidth: function () {
    //        console.log('我的width:', this.width);
    //    }
    // }
    复制代码

5、Object.getPrototypeOf()

这个方法返回给定对象的原型对象。

语法
Object.getPrototypeOf(obj)
复制代码
参数

obj : 要获取原型的对象。

返回值

给定对象的原型。如果没有继承属性,返回 null

示例
function Person (name, age) {
    this.name = name;
    this.age = age;
}
Person.prototype.sayName = function () {
    console.log(this.name);
}
let zhangsan = new Person('张三', 20);
console.log(Object.getPrototypeOf(zhangsan));
// {
//    sayName: f ()    
// }
复制代码

6、Object.getOwnPropertyNames()

这个方法返回给定对象的所有自身属性的属性名(包括不可枚举属性,但不包括Symbol值作为名称的属性) 组成的数组。

语法
Object.getOwnPropertyNames(obj)
复制代码
参数

obj : 目标对象。

返回值

在给定对象上找到的自身属性对应的字符串数组。

示例
  • 只获取可枚举的属性
    下面的例子使用 Array.prototype.filter()方法,从所有的属性名数组中去除不可枚举的属性。剩余的就是可枚举的属性
function getEnumable(target) {
    let keyNames = Object.getOwmPropertyNames(target);
    let keyAllNames = Object.keys(target);
    let tempArr = [];
    tempArr = keyNames.filter(item, index) {
        if (keyAllNames.indexOf(item) > -1) {
            return true;
        } else {
            return false;
        }
    }
    return tempArr;
}
复制代码

今天先总结到这。明天继续。

转载于:https://juejin.im/post/5b3f442e5188251afb5c65a6

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值