es6如何添加symbol(js二种特殊数据类型)
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:阵列、集合、地图)
推荐阅读
-
word打印后字体不一致(word怎么放大字体打印出来是空白)
word怎么放大字体打印出来是空白?为什么word文档字体太大打印出来纸张空白?1.很有可能打印机没墨了,加再看看墨。2.或则打印...
-
闲鱼怎么用订单号查询订单(闲鱼卖家怎么查看以前的订单)
闲鱼卖家怎么查看以前的订单?进入闲鱼“我的”页面,进入页面我卖出价格的,就可以一栏到了。闲鱼支付宝订单号是什么?订单号应该是您在购...
-
怎么把头条号做到10万粉(头条号怎么收益的)
头条号怎么收益的?自媒体创作的第5天,收益0.99元,虽然不多,但也算是好的开头。自己写的内容有人看,京东推荐有收益,也更有动力更...
-
ps教程创意ps制作复古人像海报(手机修图如何把照片做出人物彩色、背景黑白的效果)
手机修图如何把照片做出人物彩色、背景黑白的效果?如何用手机修图制作出人物色彩丰富、背景黑白分明的照片?手机修图,使人彩色,黑白背景...
-
手机怎么设置qq悬浮通知显示内容(怎么设置)(悬浮窗不显示内容)
悬浮窗不显示内容,怎么设置?1.在主主界面找到【设置一】。菜单栏【全部设置】2.找不到【用户权限】,进入首页【修改权限】。3.进入...
-
苹果下载超过200怎么设置(ios12超过200m怎么下载)
ios超过200m怎么下载?再点打开设置中,点击进入后“通用”。后再直接点击“日期和时间”。将“手动可以设置”后面的开关关闭。然后...
-
剪映怎么添加全部文本(剪映编辑文字怎样应用到全部)
剪映编辑文字怎样应用到全部?剪映怎么只给一段视频配字幕?视频导出剪映。再点击音乐。文本输入。然后把手首先按住文字拉到你必须的地方就...
-
微信里的美团外卖怎么换头像(饿了么logo尺寸是多少像素)
饿了么logo尺寸是多少像素?是800*650像素在手机上,美团店铺头像LOGO比较小,要如何你做到怎么设计也让人进店呢?不过就是...
-
ps怎么把图片里的空白去掉(PS如何抠出空白)
PS如何抠出空白?按到Ctrl键点击你要扣的图层,记得一点是点击右下角图层面板的图层而不是画布,PS可能会自动出现你选该图层所有非...
-
支付宝账号密码忘了怎么解绑(支付宝不用验证码怎么找回密码)
支付宝不用验证码怎么找回密码?1、可以打开支付宝官网首页,点登入。2、在登录页面点忘登录密码按钮。3、输入输入账户名和验证码。4、...