属性
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); // trueconsole.log(arr.constructor === Array); // trueconsole.log(newObj.constructor === Object); // trueconsole.log(newArr.constructor === Array); // trueconsole.log(newNum.constructor === Number); // trueconsole.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); // 18let 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 = vconsole.log(v);}});console.log(o.name); // 大白o.name = '1'console.log(o.name); // 大白delete o.nameconsole.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'));
