上的一些方法Object上的一些方法assigncreatedefinePropertiesdefinePropertykeysvaluesentriesfreezeisFrozensealisSealedgetPrototypeOfsetPrototypeOfisisExtensiblepreventExtensionsgetOwnPropertyDescriptorgetOwnPropertyDescriptorsgetOwnPropertySymbolsgetOwnPropertyNames1.Object.assign(target,source)将可枚举属性的值从一个或对个对象分配到目标对象,返回目标对象consttarget={a:1,b:2}constsource={b:{b1:3},c:4}constresult=Object.assign(target,source)console.log(result,target);target.b.b1=10Itcanbeseenthatassignisashallowcopy,withoutopeningupnewstoragespacetostorethecopiedvalue,directreference2.Object.create(proto,propertiesObject)createsanemptyobject,thefirstparameteristheprototypeoftheobject,andthesecondparameteristhedefaultpropertyoftheobjectfunctionSchool(name){this.name=name}letobj=Object.create(School.prototype,{p:{value:4,enumerable:false,writable:false,configurable:false},length:{value:0}})obj.q=5obj.p=5//writableisfalse,cannotbemodifieddeleteobj.p//configurableisfalse,deletionfailedfor(letiinobj){console.log(i);//enumerableisfalse,pisnotenumerated}console.log(obj);defaultpropertiescanbeconfiguredproperties,enumeration,writable,configurable3.Object.defindeProperty(obj,prop,descriptor)和Object.defineProperties(obj,props)Object.defindeProperty定义或修改对象上的一个属性并返回对象描述符writableenumerableenumerableenumerableconfigurabledeletevaluegetreadvaluesetsetvalueleto={a:{name:"张三",age:18,}}varval=nullObject.defineProperty(o.a,"rank",{configurable:false,enumerable:true,get(){console.log("获取张三的排名");returnval},set(newval){console.log("新值:"+newval);val=newval}})o.a.rank=1console.log(o.a.rank);控制台。log(o);getset和valuewritable不能同时使用。Set会在添加rank值时进行监听,可以赋值给一个中间变量或者对象上的一个属性。get在读取rank的时候会执行rank的三个点。它将监听读取操作Object.defineProperties(obj,props)defineProperty有三个参数,但只针对一个属性。defineProperties的第二个参数不是字符串,而是一个对象。它将defineProperty的第三个参数融合到第二个参数中可以配置多个属性leto={a:{name:"张三",age:18,}}varval=nullleta=Object.defineProperties(o.a,{“排名”:{价值:1,},“等级”:{get(){console.log(“Read:”+val);returnval},set(newval){console.log("更改"+newval);val=newval}}})o.a.grade=9console.log(o.a.rank,o.a.grade);控制台日志(一);属性默认配置为false4.Object。getOwnPropertyDescriptor(obj,prop)和Object.getOwnPropertyDescriptors(obj)获取指定对象自身属性的描述符。一种是获取单个,另一种是获取所有consto={}letval=0Object.defineProperties(o,{a:{value:1,enumerable:true,configurable:false,},b:{可配置:假,可枚举:假,get(){returnval},set(newval){val=newval}}})letd1=Object.getOwnPropertyDescriptor(o,"a")letd2=Object.getOwnPropertyDescriptors(o)控制台日志(d1,d2);普通的追加对象属性也会返回相关的描述,只不过与defineProperty默认值false相反5.Object.keys(obj)Object.values(obj)Object.entries(obj)keys:返回一个可枚举的数组attributevaluesforagivenobjectvalues:Returnsanarrayofenumerableattributenamesforagivenobjectentries:Returnsanenumerablearrayofattributenamesforagivenobject键值对数组consto={a:1,b:2,fn(){}}for(constkofObject.keys(o)){console.log(k);//abfn}for(constvofObject.values(o)){console.日志(v);//12fu(){}}for(consteofObject.entries(o)){console.log(e);//["a",1]["b",2]["fn",fn()]}数组原型上的keys()方法返回Number类型,Object返回字符串6.freeze(obj)isFrozen(),seal(obj)isSealed(),preventExtensions()isExtensiblefreeze冻结一个对象,不是Modification,不能添加属性,不能删除属性,不能修改它的原型。seal关闭一个对象,存在的属性可以修改,不能添加属性,不能删除属性,不能修改原型preventExtensions不能扩展,可以删除,修改,不能添加属性,不能修改原型consto1={a:1,b:2,fn(){}}Object.freeze(o1)console.log(Object.isFrozen(o1));//trueo1.a=2console.log(o1.a);//1consto2={a:1,b:2,fn(){}}Object.seal(o2)console.log(Object.isSealed(o2));//trueo2.a=2console.log(o2.a);//2consto3={a:1,b:2,fn(){}}Object.preventExtensions(o3)console.log(Object.isExtensible(o3));//falseo3.a=2console.log(deleteo3.b);//trueconsole.log(o3.a);//2freeze和seal不可扩展,不能删除,isExtensible的值也是false7.Object.setPrototypeOf(obj,prototype)Object.getPrototypeOf(obj)设置对象的原型,获取对象的原型constobj={name:"obj",getName(){console.log(this.name)}}leto={名称:“o”}对象.setPrototypeOf(o,obj)Object.getPrototypeOf(o).getName()//objo.getName()//o不推荐使用该方法和__proto__修改原型使用Object.create()创建指定原型8.Object.is(value1,value2)判断两个值是否为同值consto1={a:1}consto2={b:{c:2}}consto3={b:{c:2}}Object.assign(o1,o2)console.log(Object.is(o1.b,o2.b));//trueconsole.log(Object.is(o1.b,o3.b));//false引用的不同地址会检测到不同的值。对于原始类型,只要值相同,可见Object.assign()是浅拷贝。引用类型没有新的内存空间存储,只有9个。Symbol值的名称所有属性名称为Symbol的对象数组letf=Symbol("foo")consto={[f]:1,"a":2,b:3}constn=Object.getOwnPropertyNames(o)consts=Object.getOwnPropertySymbols(o)console.log(n,s);//["a","b"][Symbol(foo)]原型1.hasOwnProperty2.isPrototypeOf3.propertyIsEnumerable4.toLocalString5.toString6上的方法.ValueOf7。__defineGetter__(已弃用)8.__defineSetter__(已弃用)9.__lookupSetter__(已弃用)10.__lookupSetter__(deprecated)11.__proto__(propertydeprecated)12.toSource()(非标准)1.Object.prototype.hasOwnProperty(prop)检测指定属性是否有属性,可以检测Symbol类型consta=[1]console.log(a.hasOwnProperty(0));//truelets=Symbol("foo")consto={[s]:"a",}console.log(o.hasOwnProperty(s));//true2.Object.prototype.isPrototypeOf(obj)检测一个对象是否在另一个对象的原型链上functionSchool(name){this.name=name}School.prototype={constructor:School,getName(){console.log(this.name);}}functionStudent(name){School.call(this,name)}Student.prototype=Object.create(School.prototype)Student.prototype.constructor=Studentconststd1=newStudent("张三")std1.getName()//张三console.log(School.prototype.isPrototypeOf(std1));//true上面结合parasitic实现的继承可以在子类实例中检测到父类的原型在原型链上3.Object.prototype.peopertyIsEnumerable(prop)检测指定对象的某个属性是否可枚举lets1=Symbol("s1")lets2=Symbol("s2")consto={[s1]:0,}Object.defineProperties(o,{[s2]:{value:1,enumerable:true},p:{value:3,}})console.log(o.propertyIsEnumerable(s1));//trueconsole.log(o.propertyIsEnumerable(s2));//trueconsole.log(o.propertyIsEnumerable("p"));//false4.toLocalString()toString()valueOf()toLocalString返回一个本地环境字符串,适合处理时间类型toString返回一个不会因环境变化而改变的唯一字符串valueOf返回对象的原始值统一方法functiontransform(o){console.log(Object.prototype.toLocaleString.call(o));console.log(Object.prototype.toString.call(o));console.log(Object.prototype.valueOf.call(o));}基本数据类型transform(1000)//"1000""[objectNumber]"{1000}transform(true)//"true""[objectBoolean]"{true}transform(Symbol("smb"))//"Symbol('smb')""[objectSymbol]"{Symbol(smb)}transform(1000n)//"1000""[objectBigInt]"{1000n}transform("str")//"str"[objectString]"{"str"}reference数据类型transform([0,1])//"0,1""[objectArray]"[0,1]transform({a:0,b:1})//"[objectObject]""[objectObject]"{a:0,b:1}transform(newDate())//"标准时间""[objectDate]""标准时间"transform(function(){})//"function(){}""[objectFunction]"f(){}transform(newError("e"))//"Error:e""[objectError]"Error:e可以看出toLocalString返回的是其内容的字符串,toString唯一的返回值是方括号对象+数据类型stringvalueOf类型返回一个对象引用类型返回自身
