属性

constructor()

constructor(),所有对象的原型上都能继承一个constructor()属性。该方法可以用于判断类型

  1. let obj = {};
  2. let arr = [];
  3. let newObj = new Object;
  4. let newArr = new Array;
  5. let newNum = new Number(6);
  6. let newStr = new String('hello')
  7. console.log(obj.constructor === Object); // true
  8. console.log(arr.constructor === Array); // true
  9. console.log(newObj.constructor === Object); // true
  10. console.log(newArr.constructor === Array); // true
  11. console.log(newNum.constructor === Number); // true
  12. console.log(newStr.constructor === String); // true

方法

assign()

assign()方法,连接两个对象,返回一个新的对象。

  1. let obj1 = {a:'a',b:1};
  2. let obj2 = {c:'c',d:3};
  3. let newObj = Object.assign(obj1,obj2)
  4. console.log(newObj); // { a: 'a', b: 1, c: 'c', d: 3 }

create()

create()方法,创建一个新的数组。新创建对象的__proto__都指向原来对象。

  1. let obj = {
  2. name:'小明',
  3. age:18
  4. }
  5. let newobj = Object.create(obj)
  6. console.log(newobj); // {}
  7. console.log(newobj.name); // 小明
  8. console.log(newobj.age); // 18
  9. let descriptor = Object.create(null); // 没有继承的属性

defineProperties()

Object.defineProperties() 方法直接在原有对象上定义新的属性或修改现有属性,并返回改对象。

  • obj
  • props

    • value:要修改的值,可以是任何javascript的任何类型
    • configurable 是否可以删除。默认是false不可删除
    • enumerable:枚举对象的时候是否可以显示。默认是false
    • writable:是否可以重复赋值。默认为false不可重新赋值
    • get
    • set
  1. let o = Object.defineProperties(obj, {
  2. name: {
  3. value: '大白',
  4. configurable:false, // 是否可以删除
  5. enumerable:false, // 是否可以遍历
  6. writable:false // 是否可以修改
  7. },
  8. age: {
  9. value: 20,
  10. },
  11. get: (v) => {
  12. console.log(document.querySelector('span'));
  13. },
  14. set: (v) => {
  15. document.querySelector('span').innerText = v
  16. console.log(v);
  17. }
  18. });
  19. console.log(o.name); // 大白
  20. o.name = '1'
  21. console.log(o.name); // 大白
  22. delete o.name
  23. 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

定义对象中的某个属性值。

  1. // 创建一个新对象
  2. var o = {};
  3. // 在对象中添加一个属性与数据描述符的示例
  4. Object.defineProperty(o, "a", {
  5. value : 37,
  6. });
  7. console.log(o.a) // 对象o拥有了属性a,值为37
  8. // 修改参数
  9. let obj ={}
  10. let bValue;
  11. Object.defineProperty(obj, "b", {
  12. get : function(){
  13. console.log(bValue); // 得到默认值
  14. return bValue;
  15. },
  16. set : function(newValue){
  17. bValue = newValue; // 把bValue修改为传进来的值
  18. },
  19. })
  20. obj.b = 38 // 动态修改obj.b 就能做到数据劫持效果
  21. 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

通过getset可以做到通过一个变量劫持数据,得到数据,返回数据。

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'));