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的写法:有时候
