palmerye / palmerye.github.io

:memo: Personal Blog
https://palmer.arkstack.cn
17 stars 7 forks source link

Daily Notes #63

Open palmerye opened 5 years ago

palmerye commented 5 years ago

apachenode.jsnginxtomcat之间有什么区别?

就如死月大大说的,是一类东西,又不是一类东西。

【知乎:apache、node.js、nginx、tomcat谁能帮我捋一捋关系?】

palmerye commented 5 years ago

JavaScript 基于对象?面向对象?

追本溯源:什么是对象?

《面向对象分析与设计》Grady Booch这么解释“对象”:

这么解释,是不是就应了那句话:万物皆对象?

对象有以下三个特征:

JavaScript 怎么描述对象?

C++Java 等编程语言,使用“类”的方式来描述对象;而JavaScript 选用了“原型”,这有历史原因,咱不追究了,我们重点来看JavaScript 中用什么方式描述对象的三个特征。

唯一标识性

对象的唯一性一般是用内存地址来体现的,JavaScript中也不例外,对象具有唯一内存地址,才使得有唯一标识性。

状态、行为

不同语言会使用不同的术语来抽象描述它们,比如 C++ 中称它们为“成员变量”和“成员函数”,Java 中则称它们为“属性”和“方法”。

JavaScript 中,将状态和行为统一抽象为“属性”。JavaScript 对象具有高度的动态性,它赋予了使用者在运行时为对象添改状态和行为的能力。

JavaScript 对象的两类属性:数据属性、访问器属性(getter/setter)

查看属性的特征描述:

Object.getOwnPropertyDescriptor(obj, "key")

修改属性的特征:

Object.defineProperty(obj, "key", {value: 2, writable: false, enumerable: false, configurable: true})

插一脚

我们可以看到,实际上 JavaScript 对象的运行时是一个“属性的集合”,属性以字符串或者 Symbol 为 key,以数据属性特征值或者访问器属性特征值为 value。对象是一个属性的索引结构。

以上看起来,JavaScript 是基于对象的。那又是面向对象么?