重学前端学习笔记(七)--JavaScript对象:面向对象还是基于对象?
栏目: JavaScript · 发布时间: 5年前
内容简介:重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,关于第一点:关于第二、三点:
笔记说明
重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏, 每天10分钟,重构你的前端知识体系 ,笔者主要整理学习过程的一些要点笔记以及感悟,完整的可以加入winter的专栏学习【原文有winter的语音】,如有侵权请联系我,邮箱:kaimo313@foxmail.com。
1、学习JavaScript面向对象时是否有这样的疑惑?
- 为什么 JavaScript(直到 ES6)有对象的概念,但是却没有像其他的语言那样,有类的概念呢?
- 为什么在 JavaScript 对象里可以自由添加属性,而其他的语言却不能呢?
2、什么是面向对象?
2.1、JavaScript 对象的特征
2.1.1、对象的特征(来自《面向对象分析与设计》一书)
- 对象具有唯一标识性:即使完全相同的两个对象,也并非同一个对象。
- 对象有状态:对象具有状态,同一对象可能处于不同状态之下。
- 对象具有行为:即对象的状态,可能因为它的行为产生变迁。
关于第一点:
var a1 = { a: 1 }; var a2 = { a: 1 }; console.log(a1 == a2); // false
关于第二、三点:
-
c++
中称"状态和行为"为成员变量
和成员函数
-
java
中则称它们为属性
和方法
-
javaScript
中将状态和行为统一抽象为属性
winter举了个例子,代码如下:
var o = { d: 1, f() { console.log(this.d); } };
上面代码中,o是对象,d是一个属性,而函数f也是一个属性,只是写法不一样,总结来说,在JavaScript中,对象的状态和行为其实都被抽象为了属性。
2.1.2、JavaScript 中对象独有的特色
对象具有高度的动态性,这是因为 JavaScript 赋予了使用者在运行时为对象添改状态和行为的能力。
举例说明运行时如何向一个对象添加属性:
var o = { a: 1 }; o.b = 2; console.log(o.a, o.b); //1 2
为了提高抽象能力,JavaScript的属性被设计成比别的语言更加复杂的形式,它提供了数据属性和访问器属性(getter/setter)两类。
2.2、JavaScript 对象的两类属性
2.2.1、数据属性
4个特征:
value writable enumerable configurable
2.2.2、访问器(getter/setter)属性
2.2.2.1、4个特征:
getter setter enumerable configurable
2.2.2.2、 Object.getOwnPropertyDescripter 和 Object.defineProperty()
var o, d; o = { get foo() { return 17; } }; d = Object.getOwnPropertyDescriptor(o, "foo"); // d { // configurable: true, // enumerable: true, // get: /*the getter function*/, // set: undefined // } o = { bar: 42 }; d = Object.getOwnPropertyDescriptor(o, "bar"); // d { // configurable: true, // enumerable: true, // value: 42, // writable: true // } o = {}; Object.defineProperty(o, "baz", { value: 8675309, writable: false, enumerable: false }); d = Object.getOwnPropertyDescriptor(o, "baz"); // d { // value: 8675309, // writable: false, // enumerable: false, // configurable: false // }
实际上 JavaScript 对象的运行时是一个“属性的集合”,属性以字符串或者 Symbol 为 key,以数据属性特征值或者访问器属性特征值为 value。
2.3、小结
- 由于 JavaScript 的对象设计跟目前主流基于类的面向对象差异非常大,导致有“JavaScript 不是面向对象”这样的说法。
- JavaScript 语言标准也已经明确说明,JavaScript 是一门面向对象的语言,跟JavaScript 的高度动态性的对象系统密不可分。
个人总结
看完winter的这篇文章深感自己的基础之薄弱,越模糊的东西越要清楚其本质,才能保持对事物的正确判断。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 【前端基础进阶】JS原型、原型链、对象详解
- SharePoint 前端开发常用的对象之_spPageContextInfo
- 前端培训-初级阶段(13) - ECMAScript (内置对象、函数)
- 前端进击的巨人(一):执行上下文与执行栈,变量对象
- 前端进击的巨人(七):走进面向对象,原型与原型链,继承方式
- 前端培训-中级阶段(3) - DOM 文档对象模型(2019-06-27期)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
分布式服务架构:原理、设计与实战
李艳鹏、杨彪 / 电子工业出版社 / 2017-8 / 89.00
《分布式服务架构:原理、设计与实战》全面介绍了分布式服务架构的原理与设计,并结合作者在实施微服务架构过程中的实践经验,总结了保障线上服务健康、可靠的最佳方案,是一本架构级、实战型的重量级著作。 《分布式服务架构:原理、设计与实战》以分布式服务架构的设计与实现为主线,由浅入深地介绍了分布式服务架构的方方面面,主要包括理论和实践两部分。理论上,首先介绍了服务架构的背景,以及从服务化架构到微服务架......一起来看看 《分布式服务架构:原理、设计与实战》 这本书的介绍吧!