前言
最近在复习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;
}
复制代码
今天先总结到这。明天继续。