概述 :
Object是所有类的父类 , 也就是说它的方法和属性所有的对象都可以使用 . Object的相关方法和属性是提供给其他对象进行使用的
相关方法和属性
原型方法及属性 (实例方法和属性)
-
hasOwnProperty ( 判断当前对象是否具备这个属性 不会读取原型上的属性 )
let obj = { name:'tom', age:22 } function Person(name,age){ this.name = name this.age = age } Person.prototype.sex = '男' let person = new Person('jack',23) //hasOwnProperty 是判断当前对象是否具备这个属性的,返回值是布尔类型,传入需要判断的属性名 console.log(obj.hasOwnProperty('name')) //true console.log(person.hasOwnProperty('name'))//true //hasOwnProperty 不会读取原型上的属性 console.log(person.hasOwnProperty('sex'))//false
- isPrototypeOf ( 判断对象是否存在于传入对象的原型链上 )
//组合继承 function Son(){ Person.call(this)//对象冒充继承 } let person1 = new Person('rose',24) Son.prototype = person1//原型链继承 let son = new Son() //组合继承 function Child(){ Son.call(this) } Child.prototype = son let child = new Child() //isPrototypeOf是判断当前对象是否处在传入对象的原型链(__proto__)上 console.log(person1.isPrototypeOf(son))//true console.log(son.isPrototypeOf(child))//true console.log(person1.isPrototypeOf(child))//true
__defineGetter __
定义获取的方法 ( 废弃 , 有替代品 )
__defineSetter__
定义设置的方法 ( 废弃 , 有替代品 )
__lookupGetter__
返回定义的获取方法
__lookupSetter__
返回定义的设置方法
//Getter和Setter是获取和设置 (实际操作的对象和访问的对象不能是一个) //Getter方法里面返回的数据就是显示的数据,Setter要进行相关设置 let obj = { name:'tom', age:24 } //拷贝obj1的内容 let model = Object.assign({}.obj) obj.__defineGetter__('name',function(){ console.log('get触发了') return model.name }) obj.__defineSetter__('name',function(alex){ console.log('sset触发了') model.name = alex }) console.log(obj.name)//get触发了,tom obj.name='aloha' console.log(obj.name)//set触发了,get触发了,aloha //查看Getter和Setter console.log(obj.__lookupGetter__('name'))//Getter的函数 console.log(obj.__lookupSetter__('name'))//Setter的函数
- propertyIsEnumerable 判断当前属性是否可枚举 ( 遍历 )
//propertyIsEnumerable 传入一个属性,判断这个属性是否可以枚举
console.log(obj.propertyIsEnumerable('name'))
-
toLocaleString 根据本地格式转为字符串
-
toString 转为字符串
Object.prototype.toString.call(需要查找的变量,(item=>{这个item里面就有对应的类型}))
- valueOf
//转字符串 console.log(obj.toLocaleString())//本地格式 console.log(obj.toString()) //valueOf 返回对应的值 console.log(obj.valueOf())
原型属性
-
constructor 指向当前对象的构造函数
-
__proto__
原型隐式指向
静态方法 (Object.方法调用的)
-
Object.is 判断两个对象是否是一个对象 ( 相当于全等=== , 只有NaN和+0-0不同 )
Object.is(NaN,NaN)//true Object.is(+0,-0)//false +0 === -0 //true NaN === NaN //false
- Object.assign 将后面的对象拷贝到第一个对象中 ( 浅拷贝 ) , 拷贝不了继承属性和不可枚举属性
//浅拷贝 (浅拷贝第一层只拷贝值,第二层拷贝的都是地址) let obj = {arr:[1,2,3]} let obj1 = Object.assign(obj,{name:'jack',age:20}) console.log(obj) //{name:'jack',age:20} console.log(obj == obj1) //true //拷贝到一个新对象,所以不是一个地址 obj.arr.push(4) let copyObj = Object.assign({},obj) console.log(copyObj)//{arr:[1,2,3,4],name:'jack',age:20} console.log(copyObj == obj)//false
- Object . create 根据传入的内容创建相关的对象
//它会根据传入的对象创建新的对象,但是跟传入的对象不是同一个 //然后它会将这个创建好的对象指向传入对象的原型上 function Person(name){ this.name = name } let person = new Person('tom') let createObj = Object.create(person) console.log(createObj) //tom console.log(person == createObj)//fasle,创建的对象跟传入的对象不是同一个
手写实现Object.create
function myCreate(o){ //创建对象 let obj = new Object() //将传入的o加到这个对象的原型上 obj.__proto__ = o return obj } let myCreateObj = new myCreate(person) console.log(myCreateObj)
-
Object.keys 将它可枚举的key全部加入到一个迭代器返回
-
Object.values 将它的value全部加入到一个迭代器返回
-
Object.entries 将它的键值对全部加入到一个迭代器返回
//for in 遍历对象 //for of 遍历对应的迭代器(必须要实现迭代器) let obj = { name: 'tomCat', number: 5 } console.log(Object.keys(obj)) console.log(Object.values(obj)) console.log(Object.entries(obj))
-
getPrototypeOf 获取原型
-
setPrototypeOf 设置原型
//Object.setPrototypeOf 设置原型 function Person(){ this.name='tomCat' } let person = new Person() let protoObj = {age:20,address:'宇宙尽头'} Object.setPrototypeOf(person,protoObj)//传入需要设置的对象和设置的内容 console.log(person) //Object.getPrototypeOf 获取原型 console.log(Object.getPrototypeOf(person))//传入需要获取的对象就ok啦
-
freeze 冻结 ( 只能查询 ,不能删除修改增加 )
-
seal 密封 ( 只能查询和修改 , 不能删除和添加新的属性 )
-
preventExtension 不可扩展 ( 不能添加新的属性 ,可以修改删除查询 )
判断是否冻结 , 是否密封 , 是否可扩展 ( 只要冻结了 也就密封了 )
freeze > seal > PreventExtensions ( 冻结必定密封 , 密封必定不可扩展 )
-
Object.isFrozen ( ) 是否冻结
-
Object.isSealed ( ) 是否密封
-
Object.isExtensible ( ) 是否可扩展
let obj = { name:'jack', age:22, sex:'男' } Object.freeze(obj)//冻结当前obj对象 //Object.seal(obj) //密封当前obj对象 //Object.preventExtensions(obj) //当前obj对象不可扩展 console.log(obj.name)//查 obj.name = 'tomCat' //改 delete obj.sex //删 obj.address = '湖南长沙' //增 for(let key in obj){ console.log(key) //查 } //判断当前obj是否冻结 , 是否密封 , 是否可扩展 ( 只要冻结了 也就密封了 ) console.log(Object.isFrozen (obj)) console.log(Object.isSealed (obj)) console.log(Object.isExtensible(obj))
-
getOwnPropertyNames 获取所有的属性名 ( 除symbol的key以外 )
-
getOwnPropertySymbols 获取所有symbol为键的属性名
-
getOwnPropertyDescriptor 获取对应属性的详情 ( 返回属性对象 )
-
getOwnPropertyDescriptors 获取所有属性的详情 ( 返回包含所有属性对象的对象 )
let symbol = new Symbol() let obj = { name:'jack', age:20 } obj[symbol] = '你好' //获取所有的属性名 ( 除symbol的key以外 ) 传入的是一个对象,返回的是一个字符串数组 let names = Object.getOwnPropertyNames(obj) console.log(names) //获取所有symbol为键的属性名 返回symbol数组 let symbols = Object.getOwnPropertySymbols(obj) console.log(symbols) //获取对应属性的详情,传入对象和属性 ( 返回属性对象 ) let desc = Object.getOwnPropertyDescriptor(obj,'name') console.log(desc) //获取所有属性的详情,传入对象 ( 返回包含所有属性对象的对象 ) let descr = Object.getOwnPropertyDescriptors(obj) console.log(descr)
- Object . defineProperty 定义单个属性
let obj = { name:'rose' sex:'女' } Object.defineProperty(obj,'age',{ configurable:true, //是否可删除,不写默认是false enumerable:true, //是否可枚举(遍历),不写默认是fasle value:20, writable:true //是否可修改 }) console.log(obj)//{name:'rose',sex:'女',age:20} delete obj.sex for(var key in obj){ console.log(key)//name,age } obj.age = 24 console.log(obj)//{name:'rose',age:24}
属性属性 ( 基础的属性定义 )
configurable:false, enumerable:false, value:20, writable:false
访问器属性 ( 只能给已存在的属性进行访问 )
//(实际操作的对象和访问的对象不能是一个) configurable:false, enumerable:false, get(){}, //value,它把__defineGetter__替换了 set(){} //writable,它把__defineSetter__替换了
//(实际操作的对象和访问的对象不能是一个) let obj = { name:'alex', age:26, sex:'女' } let model = Object.assign({},obj) Object.defineProperty(obj,'name',{ configurable:true, enumerable:true, get(){ //获取值的时候调用,它替代了__defineGetter__ console.log('调用了get') return model.name+00 }, set(v){ //设置值的时候调用,它替代了__defineSetter__ console.log('调用了set') model.name=v } }) console.log(obj.name)//调用了get,alex00 obj.name = ajax console.log(obj.name)//调用了set,get,ajax00
- Object . defineProperties 定义多个属性
//定义多个属性 //(实际操作的对象和访问的对象不能是一个) let obj = {} let model = {} Object.defineProperties(obj,{ usename:{ configurable:true, enumerable:true, get(){ return model.usename }, set(v){ model.usename = v } }, password:{ configurable:false, enumerable:false, get(){ return model.password }, set(v){ model.password = v } } }) obj.usename = 'alex' obj.password = 123456 console.log(obj) //{} console.log(model)//{usename:'alex',password:123456}
总结
-
原型方法的重点是hasOwnProperty和isPrototypeOf
-
Object是所有类的父类 , 所以它的原型方法及属性所有的类都可以使用
-
Object的静态方法是为所有的对象服务的 , 里面的参数都是对象
-
defineProperty和观察者模式都是vue2的底层实现 ( 实现vue2的双向数据绑定 )
-
for...in只能遍历对象的可枚举属性 ( 它也可以继承父类的属性 )
面试题
for...in和Object.keys 和Object.getOwnPropertyNames的区别 ( 获取属性的三种方式 )
-
for...in包含继承的属性和自身的属性 ( 不包含不可枚举的属性 )
-
Object.keys 只包含自身的属性 ( 不包含不可枚举的属性和继承的属性 )
-
Object.getOwnPropertyNames 只包含自身的属性和不可枚举的 ( 不包含继承的属性 )
-
三个方法都不包含symbol的属性
标签:console,log,day25,Object,讲解,obj,属性,name From: https://www.cnblogs.com/itlulu/p/16867625.html