Object方法

day25 Object相关方法

概述

object类是所有类的父类、也就是说所有对象都默认继承Object类,那么对应的Object

Object

Object相关属性及方法

Object的方法主要分为原型方法和静态方法、相关属性对应的实例拥有的属性

相关属性

  • __proto__表示对象的原型指定当前构造函数的原型prototype

  • constructor 表示对象的构造函数

原型方法

hasOwnProperty(判断本身是否具备这个属性)

let obj = {
           age:18
      }
       // 原型添加属性
       Object.prototype.name='aaa'
       console.log(obj.name);// 原型属性
       console.log(obj.age);// 本身的属性
       console.log(obj.hasOwnProperty('name'));// false
       console.log(obj.hasOwnProperty('age'));// true

isPrototypeOf 判断是否处于原型链上

class Person{
           constructor(){
               this.name='tom'
          }
      }
       class Child extends Person{
           constructor(){
               super()
               this.age=18
          }
      }
       let child=new Child()
       // console.log(Child.hasOwnProperty('name'));// true
       let person=new Person()
       console.log(child.isPrototypeOf(person));// false child是否存在于person的原型链上
       console.log(person.isPrototypeOf(child));// false   person是否存在于child的原型链上
       // 判断是否处于原型链上
       console.log(child.isPrototypeOf(Person));// false
       console.log(Person.isPrototypeOf(child));// false
       // 对应的Person 的原型是否存在于child的原型链上
       console.log(Person.prototype.isPrototypeOf(child));// true
       // 将对应的child的原型进行赋值
       child.__proto__=person
       // isPrototypeOf 传入的是对应查找原型链的对象
       console.log(person.isPrototypeOf(child));// person对象是否存在于child的原型上

propertyIsEnumeable 判断属性是否可以遍历

class Animal{
           constructor(){
               this.name='dog'
               this.run=()=>{}
          }
           eat(){

          }
      }
       let animal=new Animal
       animal.sex='男'
       for(var key in animal){
           console.log(key);// name run
      }
       // 检索是否可以枚举(for in 只能遍历可以枚举的属性)
       console.log(animal.propertyIsEnumerable('run'));// true
       console.log(animal.propertyIsEnumerable('eat'));// false
       console.log(animal.propertyIsEnumerable('sex'));// true

toString 将对象转为字符串 toLocalString 将对象转为本地格式字符串

image-20230310113443281

静态方法

Object.assign 将传入的对象的内容填入第一个传入的对象内容内 返回的是第一个对象

// 里面可以传入任意对象 将对应的后面的参数的内容填入到第一个对象中 返回第一个对象
let object = Object.assign({name:'aaa'},{age:18},{sex:'男'})
console.log(object)// {name:'aaa',age:18,sex:'男'}
let copyObj = Object.assign({},first)// 浅拷贝
// 浅拷贝 拷贝第一层的值 深层拷贝地址 产生新的对象

Object.create 创建一个对象

// 根据传入的内容来创建对应的内容
let first = {
name:'jack'
}
let newObj = Object.create(first)// 根据传入的first来创建新的对象
// create他是将对应的传入的对象放入创建对象的原型上

简单实现

function create(obj){
let newObj={}
newObj.__proto__ = obj
return newObj
}

Object.keys 返回对象的所有的key 不包含不可枚举的属性 也不包含原型上的属性

Object.values 返回对象的值

Object.entries 返回对象的所有键值对

返回值都是数组

Object.is判断两个对象是否一致

let first={}
let last = {}
Object.is(first,last)

Object.getPrototypeOf 获取原型

Object.setPrototypeOf 设置原型

function Person(){}
      let person=new Person
      console.log(Object.getPrototypeOf(person));
      let obj={name:'bbb'}
      Object.setPrototypeOf(obj,person)// 将person作为obj的原型
      console.log(person.isPrototypeOf(obj));// true

对象相关操作限制的方法

密封 只能查询和修改 其他操作不允许 seal isSealed

冻结 只能查询 freeze isFrozen

不可扩展 不能进行内容的添加 preventExtensions isExtensible

冻结 必定密封和不可扩展 密封 必定不可扩展

// 查询都能做 不然的话对应的对象创建就没有意义了
let obj={name:'jack'}
console.log(Object.isExtensible(obj));// false
// 不可扩展 返回当前对象
Object.preventExtensions(obj)
// 检测是否可扩展
console.log(Object.isExtensible(obj));// true
obj.age=18 // 未加进去
obj.name='tom' // 可以修改
delete obj.name // 可以删除
console.log(obj);{}


let obj = { name: 'jack' }
// 密封 必定导致不可扩展
Object.seal(obj)
console.log(Object.isExtensible(obj));// false
// 判断是否密封
console.log(Object.isSealed(obj));// true
obj.age = 18 // 不可添加
obj.name = 'tom' // 可以修改
delete obj.name // 不可以删除
console.log(obj)// { name: 'tom' }

let obj = { name: 'jack' }
Object.freeze(obj)

// 判断是否可扩展
console.log(Object.isExtensible(obj));// false
// 判断是否密封
console.log(Object.isSealed(obj));// true
// 判断是否冻结
console.log(Object.isFrozen(obj)); // true
obj.age = 18 // 不可添加
obj.name = 'tom' // 不可以修改
delete obj.name // 不可以删除
console.log(obj);// { name: 'jack' }

属性相关的获取方法

Object.getOwnPropertyNames(获取对象上的多有属性名 (不包含symbol修饰的 不包含原型上的))

Object.getOwnPropertySymbols(获取对象上名字为symbol的属性名 不包含原型上的)

Object.getOwnPropertyDescriptors(获取所有的属性的详细对象(不包含原型上的))

Object.getOwnPropertyDescriptor(获取对应的属性的详细对象 (不包含原型上的))

function Person(){
this.name='name'
}
Person.prototype.age=18
Person.prototype[Symbol('你好')]='你好'
let person = new Person()
person[Symbol('你好')]='hello'
person.sex='男'
// 获取所有的属性名 传入对象 返回的是对应的数组
// getOwnPropertyNames 不会获取原型的属性 不会获取symbol为key的属性
let names = Object.getOwnPropertyNames(person)
console.log(names);// name sex 没有原型上的属性


// 获取所有的symbol修饰的属性
let symbols=Object.getOwnPropertySymbols(person)
console.log(symbols);

// 获取属性的详情对象
// 获取某个属性的详情对象 传入对应的对象及属性
let descriptor=Object.getOwnPropertyDescriptor(person,'name')
console.log(descriptor);


// 获取所有属性的详情对象 包含原型上的属性 不包含symbol修饰的属性
let descriptors=Object.getOwnPropertyDescriptors(person)
console.log(descriptors);

Object.defineProperty用于定义对象的属性(vue2的底层实现)

属性属性

image-20230310171708263

访问器属性

configurable 是否可以删除
enumerable 是否可以枚举
get getter 访问时调用
set setter 设置的时候调用
let obj={}
// 传入对象 传入属性 传入属性对象
Object.defineProperty(obj,'name',{
configurable:false,
enumerable:false,
value:'tom',
writable:false
})
console.log(obj)// {name:'tom'}
obj.name='aaa' // 无效configable为false
for(var key in obj){
console.log(key)// 无效 enumerable 为false
}
delete obj.name // 无效 writable 为false
console.log(obj)

数据驱动原理

let obj = {}
// 传入对象 传入属性 传入属性对象
Object.defineProperty(obj, 'name', {
// 对应的属性 默认值均为false
configurable: false,// 是否可以删除
enumerable: false,// 是否可以枚举
value: 'tom',
writable: false// 是否可以修改
})
console.log(obj)// {name:'tom'}
obj.name = 'aaa' // 无效configable为false
for (var key in obj) {
console.log(key)// 无效 enumerable 为false
}
delete obj.name // 无效 writable 为false
console.log(obj)
let _obj = {} // 借助一个新的对象来进行操作
Object.defineProperty(obj,'age',{
configurable:true,
enumerable:true,
get(){
// return obj.age 会造成栈溢出
console.log(111);
return _obj

},
set(value){
_obj.age=value
console.log(222);
}
})
obj.age = 18// 访问set
console.log(obj);// 访问

Object.defineProperties用于定义对象的多个属性

let obj={}
let _obj={}
// 传入对象 及对应的属性详情对象
Object.definePropertys(obj,{
name:{
configurable: true,// 是否可以删除
enumerable: true,// 是否可以枚举
value: 'tom',
writable: true// 是否可以修改
},
age:{
configurable: true,// 是否可以删除
enumerable: true,// 是否可以枚举
get(){
return 18
},
set(value){
_obj.age = value
}
}
})

面试题

查看属性的相关方法

for in 只能遍历可枚举的属性 (可以遍历原型上的 不可以遍历symbol) Object.keys 只能遍历本身的 (不可以遍历原型上的 也不可以遍历不可枚举的 symbol) Object.getOwnPropertyNames (可以遍历不可枚举的 不可以遍历原型上的 及 symbol)

posted @ 2023-03-15 19:59  ·阿皓  阅读(69)  评论(0)    收藏  举报