1、Object.length:
2、Object.prototype:可以为所有的Object类型的对象添加属性
es5增加了数据描述符和存取描述符:数据描述符和存取描述符只能存在一种,否则会报错
对象是一个属性集合,对象的基本特征是属性名和属性值,es5新增可属性描述符,可以更细腻的控制属性的不同操作,属性描述符有:configurable、writable、enumerable属性描述符通常和 Object.defineProperty/Object.defineProperties 一起使用来定义属性,它也会受到诸如 Object.freeze/Object.seal 等方法改变。
1:configurable:当且仅当 configurable 为 true 时,该属性才能够被改变,也能够被删除(delete),默认为 false
2:writable:writable 当且仅当 writable 为 true 时,该属性才能被赋值运算符(=)改变,默认为 false
3:enumerable: 当且仅当 enumerable 为 true 时,该属性才能够出现在对象的枚举属性(for in)中,默认为 false
备注:使用es3(传统)json方式定义对象:其 configurable/writable/enumerable 默认都是 true
使用 ES5 的 Object.defineProperty/Object.defineProperties 方式定义对象,其 configurable/writable/enumerable 默认都是 false
数据描述符汇总如下:
数据: value :基本的“名/值”、 writable: 属性是否可重写(至少存在一个)
性质:configurable、enumerable
var obj = {}
Object.defineProperty(obj, 'name', {
value: 'John'
})
// 不能 delete
delete obj.name // false
Object.defineProperty(obj, 'name', {
configurable: true,
value: 'John'
})
// 可以delete
delete obj.name // true
// es3
var obj = {name: 'John', age: 30}
//等同于
Object.defineProperty(obj, 'name', {
value: 'John',
configurable: true,
writable: true,
enumerable: true
})
Object.defineProperty(obj, 'age', {
value: 33,
configurable: true,
writable: true,
enumerable: true
})
存取描述符是由一对 getter-setter 函数功能来描述的属性
格式为:
name: {
get: function() { ... },
set: function(newVal) { ... },
enumerable: true,
configurable: true
}
例如:
var obj = {}
Object.defineProperty(obj, 'name', {
configurable: true,
enumerable: true,
get: function() {
console.log('get')
return this.value
},
set: function(newVal) {
console.log('set')
this.value = newVal
}
})
// 赋值会调用 set 方法
obj.name = 'John'
// 取值会调用 get 方法
obj.name
存取描述符汇总如下:
数据:get :取值函数getter、set: 设置函数setter (get\set至少存在一个)
性质:configurable、enumerable
1、Object.create(proto, [propertiesObject]):使用指定的原型对象和属性创建一个新对象
proto:新创建对象的原型对象
ropertiesObject:可选。如果没有指定为 undefined,则是要添加到新创建对象的可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)对象的属性描述符以及相应的属性名称。这些属性对应Object.defineProperties()的第二个参数。
2、Object.defineProperty(obj, prop, descriptor) :给对象添加一个属性并指定该属性的配置
3、Object.defineProperties():给对象添加多个属性并分别指定它们的配置
4、Object.getOwnPropertyNames(obj):返回一个数组,它包含了对象所有的可枚举或不可枚举的属性名
5、Object.getOwnPropertySymbols():返回一个数组,它包含了指定对象自身所有的符号属性。
6、扩展对象
1、Object.preventExtensions():阻止对象扩展,让一个对象变得不可扩展,也就是永远不能添加新的属性
2、Object.isExtensible():判断对象是否可扩展,即是否可以给它添加新的属性,es5调用Object.preventExtensions()后返回false
function extensionsFun () {
var obj = {name:"zhangsan"}
console.log(Object.isExtensible(obj)) // true
obj.sex = "nan"
//阻止扩展
Object.preventExtensions(obj)
obj.age = "33" //严哥模式下会报错
console.log(Object.isExtensible(obj)) // false
console.log(obj) // {name:"zhangsan",sex:"nan"}
}
7、密封对象
1、Object.seal:让一个对象密封,并返回被密封后的对象。密封对象是指那些不能添加新的属性,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性,但可以修改已有属性的值的对象。
2、Object.isSealed:判断一个对象是否密封
function sealFun (){
var obj = {name:"zhangsan"}
console.log(Object.isSealed(obj)) // false
//密封
Object.seal(obj)
console.log(Object.isSealed(obj)) // true
// 不能添加属性
obj.age = 22;
console.log(obj.age) // undefined
//删除属性
delete obj.name;
console.log(obj.name) // zhangsan
//修改已经存在属性的值
obj.name = "hani";
console.log(obj.name) // hani
//修改已有属性的可枚举性、可配置性、可写性
Object.defineProperty(obj,"name",{//报错
configurable: true,
writable: true,
enumerable: true
})
}
8、冻结对象
1、Object.freeze:这个方法比 Object.seal 更绝,冻结对象是指那些不能添加新的属性,不能修改已有属性的值,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性的对象。也就是说,这个对象永远是不可变的。
2、Object.isFrozen :判断对象是否冻结
function freezeFun (){
var obj = {name:"zhangsan"}
console.log(Object.isFrozen(obj)) // false
//密封
Object.freeze(obj)
console.log(Object.isFrozen(obj)) // true
// 不能添加属性
obj.age = 22;
console.log(obj.age) // undefined
//删除属性
delete obj.name;
console.log(obj.name) // zhangsan
//修改已经存在属性的值
obj.name = "hani";
console.log(obj.name) //zhangsan
//修改已有属性的可枚举性、可配置性、可写性
Object.defineProperty(obj,"name",{//报错
configurable: true,
writable: true,
enumerable: true
})
}
属性的简洁表示法:
A:es6允许在对象中直接写变量,属性名为变量名,属性值为变量值。
function createFun(x,y){
return {x,y}
}
console.log(createFun(1,2)) // {x:1,y:2}
B:属性名表达式:用表达式作为属性名,这时要将表达式放在方括号之内。
1、Object.assign(target, …sources):用于对象的合并,将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象
const obj1 ={
a: 1,
b: 2,
c: 3
}
const object2 = Object.assign({c: 4, d: 5}, object1);
console.log(object2.c, object2.d); // 3,5
注意点
1、浅拷贝:如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用
2:同名属性的替换
3:数组的处理:assign可以用来处理数组,但是会把数组视为对象
4:取值函数的处理:assign只能进行值得复制,如果要复制的值是一个取值函数,那么将求职后在进行复制
用途
为对象添加属性
class Point {
constructor(x, y) {
Object.assign(this, {x, y});
}
}
为对象添加方法
Object.assign(SomeClass.prototype, {
someMethod(arg1, arg2) {
···
},
anotherMethod() {
···
}
});
// 等同于下面的写法
SomeClass.prototype.someMethod = function (arg1, arg2) {
···
};
SomeClass.prototype.anotherMethod = function () {
···
};
克隆对象
//克隆对象
//将原始对象拷贝到一个空对象,就得到了原始对象的克隆,不过,采用这种方法克隆,只能克隆原始对象自身的值,不能克隆它继承的值
function clone(origin) {
return Object.assign({}, origin);
}
//如果想要保持继承链,可以采用下面的代码。
function clone(origin) {
let originProto = Object.getPrototypeOf(origin);
return Object.assign(Object.create(originProto), origin);
}
合并多个对象
2、Object.getOwnPropertyDescriptor():返回对象指定的属性配置
3、Object.getPrototypeOf():返回指定对象的原型对象。
4、Object.setPrototypeOf():设置对象的原型(即内部[[Prototype]]属性)
5、Object.is():比较两个值是否相同。所有 NaN 值都相等(这与和=不同)
6、Object.keys()(es5),Object.values(),Object.entries():
1:Object.keys()(es5):返回一个由给定对象自身可枚举(enumerable=true )的属性名组成的数组
2:Object.values() (es6):返回一个由给定对象自身可枚举(enumerable=true )的属性值的数组
3:Object.entries()(es6):返回一个由给定对象自身可枚举(enumerable=true )属性的【key,value】数组
7、super 关键字:指向当前对象的原型对象,super关键字表示原型对象时,只能用在对象的方法之中,用在其他地方都会报错。