2016 - 2024

感恩一路有你

es6如何添加symbol js二种特殊数据类型?

浏览量:4532 时间:2023-05-13 18:35:46 作者:采采

js二种特殊数据类型?

JS有两种数据类型:

基本数据类型:数字、字符串、布尔、空、未定义、符号(ES6),可以直接操作变量中存储的实际值。

引用数据类型:Object(在JS中,除了基本数据类型,所有的对象、数据、函数、正则表达式都是对象)。

如何理解JavaScript的原型和原型链?

JavaScript中的原型和原型链都是实现OOP的手段。OOP在JavaScript中的具体实现如下:

对象是属性的集合。特别地,其值是函数的属性是方法。相似对象的公共属性被提取并聚集在一起形成一个类,这些对象被称为该类的实例。同样,相似类的公共属性被提取出来,聚集在一起形成一个新类,这个新类是以前类的超类,以前的类是这个类的子类。多个超类也可以作为子类来聚集一个新的超类,这个过程会一直持续下去,直到出现一个名为Object的类,并且它的超类为Null。

类不仅是公共属性的集合,还是对象工厂。类的实例对象是由该类的构造函数创建的。构造函数负责两件事:

创建一个对象;

初始化对象;

因为方法已经提供了前者的实现,所以构造函数真正需要做的是初始化对象,这分为两件事:

让对象具有由类收集的公共属性;

根据参数,一些对象的属性被特殊化;

对于第二件事,没什么好说的,就是给要初始化的对象添加专门的属性。对于第一件事,你也可以模仿后一种实现方法,但这并不是一个明智的选择,因为这些公共属性的值在大多数情况下是不会改变的。JavaScript选择方法是:

将这些公共属性作为属性,并赋予它们默认的属性值,创建一个原型对象;

初始化时,原型对象被赋予要初始化的对象的特殊属性:_ _ proto _ _

也就是说,一个类对应一个原型对象,初始化时用_ _ proto _ _连接实例对象和原型对象。

特殊属性__proto__不仅负责连接实例和原型,还负责连接子类和超类的原型对象,实现类之间的继承关系。这样,一个对象 s类原型,超类原型,超类超类原型...连接成一个 "链条 "通过__proto__,称为对象的原型链。是的,一个对象的__proto__属性为null,说明这个对象没有原型链,Object类的原型是这样的。

为了实现通过原型初始化实例的方法,需要在访问对象的属性时相互协作:

读取属性值:先在对象中寻找属性,如果存在则返回其值;否则,在prototype对象中查找,如果存在则返回其值;否则,在原型对象的原型对象中查找,直到原型链为空,表示属性未定义,返回undefined;

给属性赋值:找到对象中的属性,如果存在就给它赋值,如果不存在就在对象中创建属性并给它赋值;

删除属性:如果属性存在于对象中,删除它,否则不做任何事情。

这种访问机制保证了对象属性可以覆盖(揭开)原型属性,但不会改变原型属性,这就是OOP的多态性。

构造函数在创建对象时需要使用prototype对象,通过prototype属性知道其对应类的prototype对象。此外,为了让实例对象知道谁创建了它,它的构造函数属性 "抓取 "构造函数。类的原型对象也被认为是由该类的构造函数创建的。

接下来,让我们 让我们看看实现OOP的具体代码:

首先,不考虑继承关系,声明类的示例代码如下:

注意:应该避免直接使用特殊属性__proto__。正式的是调用方法,方法的参数是要创建的对象的原型对象。注意:按照OOP语言的传统,构造函数的名字就是类的名字。

当一个函数被调用时,如果这个上下文被绑定到一个普通的对象(而不是空的或者全局的对象窗口),这个函数被作为对象的方法调用。

当我们用一个新的表达式创建一个对象时,构造函数被new以方法的形式调用:

在上面的示例代码中,构造函数在开头和结尾所做的事情,新的表达式,为我们做了:

New会创建一个空白对象,使其原型链绑定构造函数的原型属性,使其构造函数属性绑定构造函数;然后用这个对象作为这个上下文调用构造函数,如果构造函数不返回值,就把空白对象作为创建的对象。用代码写的是:

new调用的构造函数已经转化为构造函数,但为了保持其构造函数能力,一般实现如下:

接下来,考虑类的继承。

实例对象的初始化流程是:先由超类的构造函数初始化,再由子类的构造函数初始化,以满足子类覆盖超类的要求。基于此,示例代码如下:

写到这里,我们发现是一堆标准代码不得不写。所以早期很多前端框架陆续提供了上述代码的封装方案,但是一直没有统一的解决方案,直到ES6直接提供了类语法,整个事情才告一段落:

注意:JavaScript中的属性分为存储属性和访问属性(分别对应传统OOP语言中的字段和属性)。只有原型中的方法和访问属性可以在类中声明,但旧的方法是在原型中声明存储属性。

类表达只是语法层面的封装,最终还是基于原型和原型链。

虽然我们不。;现在不需要根据那套复杂的规范来声明类,理解原型和原型链,深入理解JavaScript的OOP机制仍然非常重要。

最后给出JavaScript内置对象之间的原型链图(粗箭头为__proto__属性,细箭头为原型属性,虚箭头为构造器属性):

(Valu:数、字符串、布尔型;符号、Contain:阵列、集合、地图)

对象 属性 构造函数

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。