前言
最近在复习js的基础内容,特此做下总结。
以下内容参考MDN
1、Object.defintProperty()
这个方法是用来设置对象属性的一些特性。
语法
Object.defineProperty(obj, prop, descriptor)复制代码
参数
obj
: 要定义或修改属性的对象。
prop
: 要定义或修改的属性。
descriptor
: 要定义或修改的特性
返回值
被设置后的对象。
关于特性
之前专门有篇文章介绍对象属性的特性。
示例
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:' {} 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;}复制代码
今天先总结到这。明天继续。