当前位置: 首页 > 后端技术 > Node.js

UnderstandingObjectsandDescriptiveFeaturesofObjects

时间:2023-04-03 19:21:22 Node.js

JavaScriptObject-OrientedOOM1(UnderstandingObjectsandDescriptiveFeaturesofObjects)日期:2018-10-31更新|JavaScript|面向对象|作者:郑傲|面向对象的语言有一个特点——都有类的概念。通过类可以创建一系列具有相似属性和功能的对象。JavaScript中没有类的概念,JS有特殊的面向对象技巧——通过原型。每个对象都是基于引用类型创建的。首先你要对Js对象有一个简单的了解。Js中的对象是Key-Value对的集合。其中Value可以是基本数据类型或引用数据类型。Key可以是任何可以转成字符串的类型(Js会自动将Key转成字符串,也可以理解为Key是字符串)I-1创建对象一开始创建对象(基础,没有人使用的方式)是创建一个Object的实例。创建后为其添加属性。varperson=newObject();person.name='张三';person.talk=function(){console.log('name',this.name);}后面最常见的用法就是通过对象字面量创建一个新的对象。varperson={name:'张三',talk:function(){console.log('name',this.name);}使用对象字面量创建理论上可以减少内存使用,提高性能,更高效(创建实例时减少原型调用,缩短原型链)。开发体验的文字方法更好。参考:使用字面量的好处I-2对象的属性首先你要明白Js中对象的属性分为两种:数据属性和访问器属性Js的一些属性是用双方括号括起来的,例如:[[Configurable]],这些属性被JS引擎访问。I-2-1数据属性数据属性包含数据值的位置并且可以被读取和写入。这个位置意味着在对象中有一个属性可以看到varobj={demo:123}上面的demo是一个data属性。data属性中有4个描述它的特性(注意区分大小写,使用时为小写)[[Configurable]]翻译:可以重新定义的可配置属性。默认值:真。[[Enumerable]]翻译:可遍历的可枚举属性(for-in)默认值:true[[Writable]]翻译:可修改的可写属性值。默认值:true[[Value]]属性Key对应的值。阅读时从这里开始阅读。默认值为undefined使用对象字面量方法为对象添加属性,[[Configurable]]`[[Enumerable]]`[[Writable]]的值为true,[[Value]的值为指定值。初始化对象后,我们就有了修改它的欲望。js为我们提供了修改(ES5)中这些描述特征的方法。在修改对象属性(A.x)的数据属性时,使用:Object.defineProperty(object,propertyofobject,descriptorobject)方法。函数名比较长,理解语义记忆:Object:首先这是一个对象的默认方法。define(定义)property(特征)写在humpcase中:Object.defineProperty()varperson={};Object.defineProperty(person,name,{writable:false,value:'张三'})console.log(person.name)//张三person.name='李四'console.log(person.name)//当张三多次调用Object.defineProperty()方法修改一个属性的可配置值时,一旦设置为false,就不能再修改。该方法最低兼容IE9+,其他现代浏览器基本都能提供该方法(不兼容建议放弃或强制升级)。I-2-2存取器属性什么是存取器属性:先看一个例子varbook={_year:2005,edition:1,}//注意这里的年份不是_year,year是存取器属性,_year是一个数据属性。Object.defineProperty(book,'year',{get:function(){returnthis._year},set:function(newVal){this.editor+=newVal-2004;this._year=newVal;}})示例可以看出accessor属性和data属性非常大的区别在于accessor属性不包含具体的值,不直接显示在对象中,也不能直接通过字面量来定义。访问器属性有get和set方法来给它们赋值。访问器属性的定义通常会导致其他数据属性发生变化。(这是它的重要作用之一)至于例子中_year的写法:有时候清晰的代码风格更能表达代码的功能。例如,在对象的属性中使用_year意味着该属性只能通过对象内部调用访问。要定义访问器属性,您必须使用Object.defineProperty()这个方法定义访问器属性并提供4个描述特征。[[Configurable]]与数据属性相同[[Enumerable]]与数据属性相同[[Get]]读取时调用函数。默认值为:undefined[[Set]]设置时调用该函数。默认值为:undefinedget和set不一定同时存在。一个的存在说明操作另一个不会得到结果,在严格模式下会报错。兼容性:IE9+I-3操作对象的多属性上面两节主要讲解操作单个属性描述特征,批量属性操作可以提高语义,简化代码。JS提供了一次定义多个属性的方法:使用Object.defineProperties(object,describeobject)方法varbook={};Object.defineProperties(book,{_year:{value:2004},edition:{value:1},年:{get:function(){returnthis._year;},set:function(newValue){if(newValue>2004){this._year=newValue;this.edition+=newValue-2004;}}}});I-4读取对象的属性Js提供了Object.getOwnPropertyDescriptor(object,property)方法来获取指定对象的特定属性的描述。方法名记忆:对象方法。获取-自身特征-描述符特征获取:获取自身:自身属性:特征描述符:描述特征使用小驼峰链接:getOwnPropertyDescriptor()没有具体指定描述特征,其值为默认值。兼容IE9+参考《JavaScript高程》