Object.create(proto, [propertiesObject])
以指定对象为原型创建新的对象
- 参数:
- proto — 表示新建对象的原型对象,即该参数会被赋值到的目标对象,可以传空(null),但是不能不传,否则会报错
- propertiesObject — 添加到新创建对象的可枚举属性,可选
var obj = {name: '南瓜', sex: 0}
var obj2 = object.create(obj, {age: {value: 18}})
obj2.age = 18 //不可做任何操作,原因可看Object.definePrototype
//obj2继承了obj,所以obj2有obj的属性
Object.hasOwnPrototype(prop)
判断是否是自有属性,而不是继承属性
var obj = {name: '南瓜'}
var obj2 = object.create(obj)
obj2.age = '18'
console.log(obj2.hasOwnPrototype('age')) //true
console.log(obj2.hasOwnPrototype('name')) //false
//返回的是Boolean值
Object.definePrototype(obj, prop, descriptor)
在一个对象上定义一个新属性,或者修改一个已经存在的属性,并返回这个对象
- 参数:
- obj — 需要定义属性的对象
- prop — 需被定义或修改的属性名
- descript — 需被定义或修改的属性的描述符
var obj = {name: '南瓜'}
object.definePrototype(obj, 'age', {
value: 18,
writable: true, //是否可写
enumerable: true, //是否可枚举(是否可用for循环等)
configurable: true, //是否可操作(比如删除)
})
object.definePrototype(obj, 'age', {
value: 18,
})
//只设置一个value值,其他3个配置即为false
object.definePrototype(obj, 'age', {
set: function(oldValue) {
value = oldValue;
},
get: function() {
return value
}
})
//此方法可以实现数据的双向绑定(vue3.0以下是通过这个实现的)
Object.keys(obj)
返回该对象的所有属性名(一个表示给定对象的所有可枚举属性的字符串数组)
var obj = {name: '南瓜', age: 18, sex: 0}
Object.keys(obj)
//['name', 'age', 'sex']
Object.values(obj)
返回该对象的所有属性值(一个包含对象自身的所有可枚举属性值的数组)
var obj = {name: '南瓜', age: 18, sex: 0}
Object.values(obj)
//['南瓜', 18, 0]
Object.assign(target, …sources)
拷贝对象(将所有可枚举属性的值从一个或多个源对象复制到目标对象),如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后面的源对象的属性将类似地覆盖前面的源对象的属性
该属性只能实现浅拷贝,无法实现深拷贝
- 参数:
- target— 目标对象
- sources— 源对象
var obj = {a: 1, b: 2}
var obj2 = {b: 3, c: 4}
Object.assign(obj, obj2)
//obj = {a: 1, b: 3, c: 4} 返回目标对象
Object.getOwnPropertyDescriptors(obj)
返回指定对象所有自身属性(非继承属性)的描述对象
通过这个方法可以解决 Object.assign() 无法正确拷贝 get 属性和 set 属性的问题 (Object.getOwnPropertyDescriptors 方法配合 Object.defineProperties 方法就可以实现正确拷贝)
var obj = {name: '南瓜'}
var obj2 = object.create(obj)
obj2.age = '18'
Object.getOwnPropertyDescriptors(obj2)
//age: {value: 18, writable: true, enumerable: true, configurable: true}