重学前端学习笔记(七)--JavaScript对象:面向对象还是基于对象?
栏目: JavaScript · 发布时间: 6年前
内容简介:重学前端是程劭非(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期)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Hit Refresh
Satya Nadella、Greg Shaw / HarperBusiness / 2017-9-26 / USD 20.37
Hit Refresh is about individual change, about the transformation happening inside of Microsoft and the technology that will soon impact all of our lives—the arrival of the most exciting and disruptive......一起来看看 《Hit Refresh》 这本书的介绍吧!