当前位置: 首页 > Web前端 > JavaScript

js面向对象编程,你需要知道这些

时间:2023-03-26 20:43:41 JavaScript

javascript中的对象由key和value组成,key是一个标识符,value可以是任意类型。创建对象的方法1.通过构造函数varobj=newObject()obj.name='alice'obj.age=182.通过字面量varobj={name:'alice',age:18}属性描述符对属性进行精确的操作,比如定义属性是否可以删除、遍历或修改1.语法//定义一个属性Object.defineProperty(Object,PropertyKey,attributes)//定义多个属性Object.defineProperties(Object,properties))2.属性描述符feature属性描述当通过对象定义时,默认值是通过属性描述符定义的。默认值是可配置的,定义属性是否可以删除或者重新定义truefalsenumerable定义属性是否可以枚举,比如是否可以通过forin/Object.keystruefalsewritabletruefalsevalue读取属性修改值的操作进行修改undefinedundefinedget获取属性时执行的函数undefinedundefinedset设置属性时执行的函数undefinedundefined3、属性描述符的分类属性描述符分为数据属性描述符和读取属性描述符。数据属性描述符用于定义属性,读取属性描述符用于读取和读取函数中不愿意暴露的属性。不同的属性描述符设置操作不同。可操作的属性也不同。分类configurableenumerablewritablevaluegetset数据属性描述符√√√√××访问属性描述符√√××√√4.定义给obj对象添加skill属性,属性描述不可删除或重定义,不可修改,可枚举varobj={name:'alice',age:18}Object.defineProperty(obj,'skill',{configurable:false,writable:false,可枚举:true,值:'flying',})console.log(obj)deleteobj.skillconsole.log(obj)obj.skill='swimming'console.log(obj),所以上面的删除和修改都是无效操作,执行结果如下对象的其他方法1.获取对象的属性描述符getOwnPropertyDescriptorgetOwnPropertyDescriptors2.操作属性preventExtensions禁止新增属性sealClosed属性,即禁止添加或删除属性freeze冻结属性,即禁止添加、修改或删除属性propertyvaruser={name:'kiki',age:18}console.log('getOwnPropertyDescriptor',Object.getOwnPropertyDescriptor(user,'name'))console.log('getOwnPropertyDescriptors',Object.getOwnPropertyDescriptors(user))Object.preventExtensions(user)console.log('isExtensible',Object.isExtensible(user))user.skill='flying'console.log('user',user)Object.seal(user)console.log('isSealed',Object.isSealed(user))deleteuser.ageconsole.log('用户',用户)Object.freeze(用户)console.log('isFrozen',Object.isFrozen(user))user.name='alice'console.log(user)上面代码的执行结果如下原型1.隐式原型每个对象都有一个隐式原型,可以通过Object.getPrototypeOf或__proto__获得(存在浏览器兼容性问题)。搜索元素时,如果对象本身没有,将搜索原型为varobj={}console.log(obj.__proto__)console。log(Object.getPrototypeOf(obj))console.log(obj.name)obj.__proto__.name='alice'console.log(obj.name)对象的隐式原型指向一个空对象2.显式原型每个函数的原型除了隐式原型外,还有一个显式原型。原型中有一个指向函数本身的属性构造函数在构造函数中,可以使用new关键字批量创建对象1.定义方法functionfoo()varf=newfoo()2.new关键字的操作在内存中创建一个新对象Object(空对象)对象的__proto__属性被指定为构造函数的原型属性。构造函数的this会指向创建的对象,执行构造函数的代码。如果函数不返回非空对象,则返回创建的新对象3.内存中的表现new关键字会将创建对象的__proto__属性赋值给构造函数Person(){}var的prototype属性p1=newPerson()varp2=newPerson()console.log(p1.__proto__===Person.prototype)//trueconsole.log(p1.__proto__===p2.__proto__)//true图标如下以上是面向对象编程的部分内容,下篇记录js中的继承方式,关于js的高级,开发者需要掌握的地方还有很多,可以看我写的其他博文,他们更新中~