属性
constructor()
constructor()
,所有对象的原型上都能继承一个constructor()
属性。该方法可以用于判断类型
let obj = {};
let arr = [];
let newObj = new Object;
let newArr = new Array;
let newNum = new Number(6);
let newStr = new String('hello')
console.log(obj.constructor === Object); // true
console.log(arr.constructor === Array); // true
console.log(newObj.constructor === Object); // true
console.log(newArr.constructor === Array); // true
console.log(newNum.constructor === Number); // true
console.log(newStr.constructor === String); // true
方法
assign()
assign()
方法,连接两个对象,返回一个新的对象。
let obj1 = {a:'a',b:1};
let obj2 = {c:'c',d:3};
let newObj = Object.assign(obj1,obj2)
console.log(newObj); // { a: 'a', b: 1, c: 'c', d: 3 }
create()
create()
方法,创建一个新的数组。新创建对象的__proto__
都指向原来对象。
let obj = {
name:'小明',
age:18
}
let newobj = Object.create(obj)
console.log(newobj); // {}
console.log(newobj.name); // 小明
console.log(newobj.age); // 18
let descriptor = Object.create(null); // 没有继承的属性
defineProperties()
Object.defineProperties()
方法直接在原有对象上定义新的属性或修改现有属性,并返回改对象。
- obj
props
- value:要修改的值,可以是任何
javascript
的任何类型 - configurable 是否可以删除。默认是
false
不可删除 - enumerable:枚举对象的时候是否可以显示。默认是
false
- writable:是否可以重复赋值。默认为
false
不可重新赋值 - get
- set
- value:要修改的值,可以是任何
let o = Object.defineProperties(obj, {
name: {
value: '大白',
configurable:false, // 是否可以删除
enumerable:false, // 是否可以遍历
writable:false // 是否可以修改
},
age: {
value: 20,
},
get: (v) => {
console.log(document.querySelector('span'));
},
set: (v) => {
document.querySelector('span').innerText = v
console.log(v);
}
});
console.log(o.name); // 大白
o.name = '1'
console.log(o.name); // 大白
delete o.name
console.log(o.name); // 大白
defineProperty()
defineProperty
方法,在一个对象上定义一个新的属性,或者修改一个对象的现有属性,并且返回这个对象。vue2数据劫持就是使用这个方法。
obj:需要定义/修改的对象
prop:要定义/修改属性的名称
value
定义传进来的参数的值。(第二个参数)writable
数据是否能被修改,true
可被修改,false
不能修改。默认true
。enumerable
定义了对象的属性是否可以在for...in
循环和Object.keys()
中被枚举。get
一个给属性提供 getter 的方法,如果没有 getter 则为undefined
。当访问该属性时,该方法会被执行,方法执行时没有参数传入,但是会传入this
对象(由于继承关系,这里的this
并不一定是定义该属性的对象)。set
一个给属性提供 setter 的方法,如果没有 setter 则为undefined
。当属性值修改时,触发执行该方法。该方法将接受唯一参数,即该属性新的参数值。
descriptor:属性描述
value
定义对象中的某个属性值。
// 创建一个新对象
var o = {};
// 在对象中添加一个属性与数据描述符的示例
Object.defineProperty(o, "a", {
value : 37,
});
console.log(o.a) // 对象o拥有了属性a,值为37
// 修改参数
let obj ={}
let bValue;
Object.defineProperty(obj, "b", {
get : function(){
console.log(bValue); // 得到默认值
return bValue;
},
set : function(newValue){
bValue = newValue; // 把bValue修改为传进来的值
},
})
obj.b = 38 // 动态修改obj.b 就能做到数据劫持效果
console.log(obj.b);
writable()
当
writable
属性设置为false
时,该属性被称为“不可写”。它不能被重新分配。
let obj ={}
Object.defineProperty(obj,'test',{
value:20,
// writable:true
})
obj.test = 22;
console.log(obj.test);
enumerable()
enumerable
定义了对象的属性是否可以在for...in
循环和Object.keys()
中被枚举
Object.defineProperty(obj,'a',{value:1,enumerable:true});
Object.defineProperty(obj,'b',{value:2});
Object.defineProperty(obj,'c',{value:3});
for(k in obj){
console.log(k); // a
}
console.log(Object.keys(obj)); // a
configurable()
configurable
方法为true
时可以被修改,默认为false
不可以被修改。
let obj ={}
Object.defineProperty(obj,'test',{
value:20,
configurable:true
})
delete obj.test;
console.log(obj.test); // undefined
get/set
通过
get
和set
可以做到通过一个变量劫持数据,得到数据,返回数据。
let obj ={}
let nobj; // 修改这个对象改的是test
let arr =[]; // 统计传入的值
Object.defineProperty(obj,'test',{
get(){
console.log(nobj); //
return nobj;
},
set(value){
arr.push({val:value})
return nobj = value;
}
})
obj.test = 12
obj.test = 13
console.log(obj.test); // 13
console.log(arr); //[ { val: 12 }, { val: 13 } ]
entries()
entries()
返回一个可枚举的键值对数组
,使用for..in..
循环,并且默认排序效果。
let obj = {19:"a",1:"b",23:"c"};
let newObj = Object.entries(obj)
console.log(newObj); // [ '1', 'b' ], [ '19', 'a' ], [ '23', 'c' ] ]
for([k,v] of newObj){
console.log(`${k}:${v}`);
// 1:b
// 19:a
// 23:c
}
fromEntries()
fromEntries()
把一个键值对数组转换为对象。
let arr = [[ '1', 'b' ], [ '19', 'a' ], [ '23', 'c' ] ]
const obj = Object.fromEntries(arr);
console.log(obj) // { '1': 'b', '19': 'a', '23': 'c' }
freeze()
freeze()
冻结对象,冻结的对象不能修改、删除。
let obj = {name:'小明'}
Object.freeze(obj)
obj.mame = '大白'
delete obj.name;
console.log(obj); // { name: '小明' }
is()
is()
判断连个值对不对等
console.log(Object.is(undefined,undefined)); // true
keys()
keys()
以数组格式展示对象的key
值
let obj = {name:'小明',age:18}
console.log(Object.keys(obj)); // [ 'name', 'age' ]
values()
values()
以数组格式展示对象的value
值
let obj = {name:'小明',age:18}
console.log(Object.values(obj)); // [ '小明', 18 ]
hasOwnProperty()
hasOwnProperty()
判断对象上是否存在一个指定的属性。返回一个Boolean
值。
let obj = {name:'小明',age:18};
console.log(Object.hasOwnProperty('name'));