>[success] # js 对象到底是什么 >[danger] ##### 站在多语言的角度去看对象 ~~~ 1.大部分人编程,可能都是从接触后台语言开始的,在类似' C++、Java' 这些语言,他们先创建了 类,又从类里面产生了对象。让大部分开发总会思维定式觉得,什么语言都是类创建对象,并且 学什么语言的时候都会往这种结构去靠 2.js在语言设计初期选择另一种实现方式'原型',然而实现原型两种方式: 2.1.一个是并不真的去复制一个原型对象,而是使得新对象持有一个原型的引用; 2.2.另一个是切实地复制对象,从此两个对象再无关联。 ~~~ >[danger] ##### 原型和类 ~~~ 1.根据上面的描述我们把常见的编程语言分成两种'基于类' 和'基于原型','js属于基于原型' 1.1.'基于类'的编程提倡使用一个关注分类和类之间关系开发模型。在这类语言中,总是先有类, 再从类去实例化一个对象。类与类之间又可能会形成继承、组合等关系。类又往往与语言的类型系统整合, 形成一定编译时的能力 1.2.'基于原型'引用'mdn中的解释':在这种风格中,我们不会显式地定义[类],而会通过向其它类的实例(对象) 中添加属性和方法来创建类,甚至偶尔使用空对象创建类。 简单来说二者的区别:'基于原型'这种风格是在不定义class的情况下创建一个 'object' 2.因此无论是' C++、Java' 这些'基于类' 还是说'js'这种基于'基于原型',他们本质都是'面向对象'只是实现方式不同 3.但由于某些原因'JavaScript' 在推出之时要求模仿java,所以引入了' new、this' 等语言特性,让在更多的时候 大家忽略了'js'基于原型链的优势 注:这里要说明像java这种语言对象是不能随便的添加属性,相比来说'js' 这种更加灵活的语言有了自己的优势 ~~~ * 对注释通过代码说明 ~~~ // 这是'java 、c++'语言所不具备的 var o = { a: 1 }; o.b = 2; console.log(o.a, o.b); //1 2 ~~~ >[danger] ##### 什么是对象 ~~~ 1.上面从已经可以知道,'js' 也好,'C++、Java'也好,他们都是围绕对象,只是实现的本质不同,到底什么是对象 ,这里引用'winter老师' 文章对'Grandy Booch《面向对象分析与设计》'中的总结来看 1.1.对象具有唯一标识性:即使完全相同的两个对象,也并非同一个对象。 1.2.对象有状态:对象具有状态,同一对象可能处于不同状态之下。 1.3.对象具有行为:即对象的状态,可能因为它的行为产生变迁。 ~~~ * 对上面简单解释 ~~~ 1.对1.1的解释 可以通过代码来看 var a1 = {o:1} var a2 = {o:2} console.log(a1 === a2) // false 我们都知道对象本质是内存地址的指向,因此a1和a2看起来像本质也是不同的 2.对1.2、1.3的解释,在'java' 简单粗暴理解他们对象中的'行为'就是'方法','状态'就是'属性',在js中我们更多 的是喜欢把两者共同称为属性 var o = { d: 1, // 我是属性 f() { // 我也是属性 console.log(this.d); } }; ~~~ >[danger] ##### 都是对象了 js还有什么不同 ~~~ 1.现在我们可以很确切的说'js' 是面向对象的语言,也知道了它和'java、c++'等不同他是'基于原型'的设计理念 ,正是因此让js 有了许多与众不同的特点。其中也包含了' 数据属性/访问器属性' 2.这里可以引用'winter老师文章里的话来说': 对 JavaScript 来说,属性并非只是简单的名称和值,JavaScript 用一组特征(attribute)来描述属性(property)。 ~~~ * 这里简单来讲解' 数据属性/访问器属性' ~~~ 1.接下来的这些属性讲解 ,可以理解成:它允许使用者在写和读属性时,得到完全不同的值,它可以视为一种函数 的语法糖。 1.1 属性: 'value':就是属性的值。 'writable':决定属性能否被赋值。 'enumerable':决定 for in 能否枚举该属性。 'configurable':决定该属性能否被删除或者改变特征值 1.2 访问器属性: 'getter':函数或 undefined,在取属性值时被调用。 'setter':函数或 undefined,在设置属性值时被调用。 'enumerable':决定 for in 能否枚举该属性。 'configurable':决定该属性能否被删除或者改变特征值。 ~~~ >[danger] ##### 关于更多 ~~~ 1.想对'js原型' 有更深入的了解参考文章目录中的'js -- 原型模式了解' 2.想对'数据属性/访问器属性' 有更深入的了解参考文章目录中的'Object -- 数据属性/访问器属性' ~~~ >[danger] ##### 总结 ~~~ 1.当我从'java' ,'pyhon' 这些 语言 转换到'js'时候我最不理解的就是'js'的对象。看起来和这些语言相同,但实际 使用起来让我脑中回荡着这'小朋友是不是有很多问号',仔细来说的学习'js' 可能需要适当的丢弃一些原有对 编程的认识,因此身边也能常见到很多后台开发在管理前端的时候,更多喜欢将后台的代码规则带入,这种 带入我觉得对整体代码结构维护是有提升的,但也抹杀了js一些自己的特点 ~~~ >[danger] ##### 参考文章 [winter -- 重学前端](https://time.geekbang.org/column/article/79539)