JavaScript Object
JS的Object到底是啥东西呢?它有啥东西呢? 我们简单知道的,就是new一个Object实例对象,那这个实例对象又何Object又有什么关系呢?
先打印一下看看
console.dir(Object);
1、prototype
为啥要先说这个呢?——原型 这prototype里面的内容就是:new出来的对象的原型链上(__proto__)的内容 另一篇文章:{}对象的原型对象
2、assign(obj1, obj2)
官方解释:将所有可枚举属性的值从一个或多个源对象分配到目标对象。它将返回目标对象。
理解:两个参数对象,把obj2合到obj1上,相同的属性会覆盖掉,更改obj1的内容,返回更改后的obj1。
let obj1 = {
name: 'obj1',
age: 18,
}
let obj2 = {
age: 24,
phone: 114
}
console.dir(Object.assign(obj1,obj2));
console.log(obj1);
2、create(obj)
官方解释:创建一个新对象,使用现有的对象来提供新创建的对象的__proto__
理解:参数是个对象,创建了个新对象,新对象有个[[Prototype]],里面的内容就是参数对象,这里在结合另一篇文章:{}对象的原型对象去瞅瞅
let obj1 = {
name: 'obj1',
age: 18,
}
console.dir(Object.create(obj1));
这里我又发现了另一个问题,另一篇文章:{}对象的原型对象里的{},如果是create()出来的,那参数应该是啥????换句话说,空对象的[[Prototype]]是谁??? let {} = Object.create(?????这里应该是啥)
3、defineProperties(obj, props)
官方解释:直接在一个对象上定义新的属性或修改现有属性,并返回该对象。
理解:定义一个对象的属性,通过设置某些值(第二个参数props里面)(或称之为描述符),使得这个对象的值具有自己的特点
第二个参数的值(描述符)有:
- value: 这个属性的值,默认undefined
- configurable:这个属性的描述符可不可以被修改和这个属性可不可以被删除,默认false
- enumerable:该属性可不可以出现在对象的枚举属性中,默认false
- writable:该属性的值(value)可不可以被修改,默认false
- get:返回该属性的值,不可与value同用,默认undefined
- set:设置该属性的值,默认undefined
就是说,默认全是false,什么情况下才会用这些东西呢?反之我是没用到过
1、基础使value
let obj = {};
Object.defineProperties(obj, {
'property0': {
value: 'Hello World',
}
});
console.log(obj);
给obj加了个属性:property0,值为’Hello World’
2、configurable
let obj = {};
Object.defineProperties(obj, {
'property0': {
value: 'Hello World',
configurable:true,
},
'property1': {
value: true,
}
});
delete obj.property0;
delete obj.property1;
console.log(obj);
属性property0可以被删除,property1不行。因为property0的configurable是true,至于文档说的可修改该属性的描述符没试
3、enumerable
let obj = {};
Object.defineProperties(obj, {
'property0': {
value: 'Hello World',
configurable:true,
enumerable:true
},
'property1': {
value: true,
},
'property2': {
value: [1,2,3],
enumerable:true
}
});
for (i in obj){
console.log(i);
}
property0 property2两个属性可以被枚举到(我单纯的理解能被for…in到的就是可枚举的)
4、writable
let obj = {};
Object.defineProperties(obj, {
'property0': {
value: 'Hello World',
configurable:true,
enumerable:true
},
'property1': {
value: true,
},
'property2': {
value: [1,2,3],
enumerable:true
},
'property3': {
value: "ABCDEFG",
writable:true
},
});
Object.assign(obj, {
property0:"yes",
property3:'lol'
})
console.log(obj);
property0不能被修改,会报错的。property3可以
5、get和set
let obj = {};
let property4Get = "LOL"
Object.defineProperties(obj, {
'property0': {
value: 'Hello World',
configurable:true,
enumerable:true
},
'property1': {
value: true,
},
'property2': {
value: [1,2,3],
enumerable:true
},
'property3': {
value: "ABCDEFG",
writable:true
},
"property4":{
get(){
return "这是get方法返的" + property4Get
},
set(value){
property4Get = value
}
}
});
console.log(obj.property4);
obj.property4 = "LOLOLOL"
console.log(obj.property4);
不能和value同用,property4直接用和直接改就行,见上边代码
4、defineProperty(obj, prop, descriptor)
和defineProperties一样都是去新建或修改对象的属性。但defineProperty是单个的去设置属性:defineProperty(obj, “property0属性名”, {描述符})
5、entries
待续~~~
|