《JS权威指南学习总结--6.2属性的查询和设置》
内容要点:
一.数组元素通过字符串索引而不是数字索引,这种数组就是我们所说的关联数组,也称散列、映射或字典。
二.继承
1.JS对象具有"自有属性",也有一些属性是从原型对象继承而来的。
2.假设要查询对象o的属性x,如果o中不存在x,那么将会继承在o的原型对象中查询属性x。如果原型对象中也没有X,但这个原型对象也有原型,那么继续在这个原型对象的原型上执行查询,直到找到X或者查找到一个原型是null的对象为止。可以看到,对象的原型属性构成了一个"链",通过这个"链"可以实现属性的继承。
例如:
var o={} //o从 Object.prototype 继承对象的方法
o.x=1; //给o定义一个属性x
var p=inherit(o); //P继承o和Object.prototype
p.y=2; //给P定义一个属性y
var q=inherit(p); //q继承p、o和Object.prototype
q.z=3; //给q定义一个属性z
var s=q.toString(); //toString继承自Object.prototype
q.x+q.y // => 3 : x和y分别继承自o和p
现在假设给对象o的属性x赋值,如果o中已经有属性x(这个属性不是继承来的),那么这个赋值操作只改变这个已有属性的值。
如果o中不存在属性x,那么赋值操作给o添加一个新属性x。
如果之前o继承自属性x,那么这个继承的属性就被新创建的同名属性覆盖了。
属性赋值操作首先检查原型链,以此判断是否允许赋值操作。例如,如果o继承自一个只读属性x,那么赋值操作是不允许的。
如果允许属性赋值操作,它也总是在原始对象上创建属性或对已有的属性赋值。而不会去修改原型链。
在JS中,只有在查询属性时才会体会到继承的存在,而设置属性则和继承无关。这是JS的一个重要特征,该特征让程序员可以有选择地覆盖继承的属性。
属性赋值要么失败、要么创建一个属性,要么在原始对象中设置属性,但是有一个例外:
如果o继承自属性x,而这个属性是一个具有setter方法的accessor属性,那么这时将调用setter方法而不是给o创建一个属性x。
需要注意的是:
setter方法是由对象o调用的,而不是定义这个属性的原型对象调用的。因此如果setter方法定义任意属性,这个操作只是针对o本身,并不会修改原型链。
三.属性访问错误
1.查询一个不存在的属性并不会报错,如果在对象o自身的属性或继承的属性中均未找到属性,属性访问表达式o.x返回undefined.
2.但是,如果对象不存在,那么试图查询这个不存在的对象的属性就会报错。null和undefined值都没有属性,因此查询这些值得属性就会报错。
例如:
//抛出一个类型错误异常,undefined没有length属性
var len = book.subtitle.length;
3.两种避免出错的方法:
1)一种冗余但是很易懂的方法
var len = undefined;
if(book){
if(book.subtitle) len = book.subtitle.length;
}
2)一种更简练的常用方法,获取subtitle的length属性或undefined
var len = book && book.subtitle && book.subtitle.length;
4.给对象o设置属性p会失败的场景
1)o的属性p是只读的,不能给只读属性重新赋值(defineProperty()方法中有一个例外,可以对可配置的只读属性重新赋值)
2)o中的属性p是继承属性,且它是只读的:不能通过同名自有属性覆盖只读的继承属性
3)o中不存在自有属性p:o没有使用setter方法继承属性P,并且o的可扩展性是false。如果o中不存在p,而且没有setter方法可供调用,则p一定会添加至o中。但如果o不是可扩展的,那么在o中不能定义新属性。
《JS权威指南学习总结--6.2属性的查询和设置》的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
随机推荐
- linux c 需要掌握的技能大概——前辈的话
gcc+gdb+makefile+vi是一套组合,不能单纯的拆分开来学习. gcc主编译单个文件 gdb调试 makefile用于大型工程解决不同源文件的依赖关系 vi/emacs是编辑器 如果有条件 ...
- VR电影这一新概念在中国电影道路上的探索
在12月的一个下午,Kevin Geiger正在进行关于VR中的故事讲述的一次再普通不过的演讲.地点是北京电影学院里一个围的水泄不通的场馆,他鼓励大家都来参与电影制作,无论是导演.演员还是电影行业的任 ...
- Pos终端中的主密钥、工作密钥、pin密钥、mac密钥
下面介绍一下加密机中最主要的几种密钥: 1.加密机主密钥(MK) 加密机主密钥(Master Key - MK)是存入在HSM机内的由三个成分合成的一对最上层密钥.在HSM机器以外的地方不会以明文形式 ...
- [coding horror] 1 - sum 2
sum 2 描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 对应每个测试案例,输出两个数,小的先输出. codi ...
- SqlParameter 中 top 的使用
public DataTable GetAdminTopDCSCheckReport(int top) { StringBuilder strSql = new StringBuilder(); st ...
- Scala减少代码重复
高阶函数可以把其它函数当作函数参数,帮助我们减少代码重复,例如: object FileMatcher { private def fileHere = (new File(".\\file ...
- 十分钟学会 tmux
tmux 是一款终端复用命令行工具,一般用于 Terminal 的窗口管理.在 macOS 下,使用 iTerm2 能应付绝大多数窗口管理的需求. 如上图所示,iTerm2 能新建多个标签页(快捷键 ...
- git换行符之autoCRLF配置的意义
关于git换行符处理的问题,我查了一查,自己的设置中,global-config中设了autocrlf=false,systemwide中将autocrlf设成了true. 关于配置的作用域,syst ...
- 在Proteus中添加标号
1.Proteus中添加组件后双击引脚可以快速生成一个最近的端口. 2.按A调出设置界面 3.在String中写:net=H#,"H"可以换成自定义前缀.count为起始值,inc ...
- openwrt 更改默认主题
BB 版本默认的主题为 bootstrap,想要修改为其他的主题,可以按照如下方法修改: 1.查看可以使用的主题. "make menuconfig" ---> " ...