【JavaScript】——“重学前端”02对象——面向对象还是基于对象

什么是对象:

从人类的认知角度来说,对象应该是下列事物之一:
1. 一个可以触摸或者可以看见的东西;
2. 人的智力可以理解的东西;
3. 可以指导思考或行动(进行想象或施加动作)的东西。

JavaScript 对象的特征:

不论我们使用什么样的编程语言,我们都先应该去理解对象的本质特征。

总结来看,对象有如下几个特点:
对象具有唯一标识性:即使完全相同的两个对象,也并非同一个对象。
对象有状态:对象具有状态,同一对象可能处于不同状态之下。
对象具有行为:即对象的状态,可能因为它的行为产生变迁。

 唯一标识性:

一般而言,各种语言的对象唯一标识性都是用内存地址来体现的, 对象具有唯一标识的内存地址,所以具有唯一的标识。

状态和行为:

关于对象的第二个和第三个特征“状态和行为”,不同语言会使用不同的术语来抽象描述它
们,比如:

C++ 中称它们为“成员变量”和“成员函数”,

Java 中则称它们为“属性”和“方法”,

JavaScript 中,将状态和行为统一抽象为“属性”。

下面这段代码,

 o 是对象,对 JavaScript 来说,d 和 f 就是两个普通属性。只是写法不太相同。

var o = {
     d: 1,
     f() {
         console.log(this.d);
     } 
};

JavaScript 中对象独有的特色是:对象具有高度的动态性,这是因为 JavaScript 赋予了使用者在运行时为对象添改状态和行为的能力。比如,JavaScript 允许运行时向对象添加属性。

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

 数据属性:

数据属性具有四个特征。
value:就是属性的值。
writable:决定属性能否被赋值。
enumerable:决定 for in 能否枚举该属性。
configurable:决定该属性能否被删除或者改变特征值。

在大多数情况下,我们只关心数据属性的值即可。

访问器(getter/setter)属性:

它也有四个特征。
getter:函数或 undefined,在取属性值时被调用。
setter:函数或 undefined,在设置属性值时被调用。
enumerable:决定 for in 能否枚举该属性。
configurable:决定该属性能否被删除或者改变特征值。

访问器属性使得属性在读和写时执行代码,它允许使用者在写和读属性时,得到完全不同的值,它可以视为一种函数的语法糖。

通常用于定义属性的代码会产生数据属性,其中的 writable、enumerable、configurable 都默认为 true。我们可以使用内置函数Object.getOwnPropertyDescripter 来查看:

 var o = { a: 1 };
 o.b = 2;

 //a 和 b 皆为数据属性
 Object.getOwnPropertyDescriptor(o,"a") // {value: 1, writable: true, enumerable: true, configurable: true}
 Object.getOwnPropertyDescriptor(o,"b") // {value: 2, writable: true, enumerable: true, configurable: true}

这里使用了两种语法来定义属性,可以发现,这样定义出来的属性都是数据属性writeable、
enumerable、configurable 都是默认值为 true。

如果我们要想改变属性的特征或者定义访问器属性,我们可以使Object.defineProperty,示例如下:

(不了解Object.defineProperty方法的可以先去看一下我的这篇笔记Object.defineProperty,再看就非常明白了

 var o = { a: 1 };
 Object.defineProperty(o, "b", {value: 2, writable: false, enumerable: false, configurable: false})
//a 和 b 都是数据属性,但特征值变化了
 Object.getOwnPropertyDescriptor(o,"a"); // {value: 2, writable: true, enumerable: true, configurable: true}
 Object.getOwnPropertyDescriptor(o,"b"); // {value: 2, writable: false, enumerable: false, configurable: false}
 
 o.b = 3;
 console.log(o.b); // 2

因为 writable 特征为 false,所以我们重新对 b 赋值,b 的值不会发生变化。

在创建对象时,也可以使用 get 和 set 关键字来创建访问器属性,代码如下所示:

var o = { get a() { return 1 } };

console.log(o.a); // 1

访问器属性跟数据属性不同,每次访问属性都会执行 getter 或者 setter 函数。这里我们的
getter 函数返回了 1,所以 o.a 每次都得到 1。

        实际上 JavaScript 对象的运行时是一个“属性的集合”,属性字符串或者 Symbolkey,以数据属性特征值或者访问器属性特征值value

        对象是一个属性的索引结构(索引结构是一类常见的数据结构,我们可以把它理解为一个能够以比较快的速度用 key 来查找 value 的字典)。

我们以上面的对象 o 为例,你可以想象一下:

        “a”是 key。
        {writable:true,value:1,configurable:true,enumerable:true}是 value。

能够以 Symbol 为属性名,这是JavaScript 对象的一个特色。

JavaScript 是一门面向对象的语言,因为 JavaScript 的高度动态性的对象系统,使得它可以模仿多数面向对象编程范式。

猜你喜欢

转载自blog.csdn.net/qq_50497708/article/details/128176296