内容要点:

一.数组元素通过字符串索引而不是数字索引,这种数组就是我们所说的关联数组,也称散列、映射或字典。

二.继承

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属性的查询和设置》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. [Angular Directive] Implement Structural Directive Data Binding with Context in Angular

    Just like in *ngFor, you're able to pass in data into your own structural directives. This is done b ...

  2. (五)python的发展历史

    1989年,为了打发圣诞节假期,Guido开始写Python语言的编译器.Python这个名字,来自Guido所挚爱的电视剧Monty Python's Flying Circus.他希望这个新的叫做 ...

  3. linux c 需要掌握的技能大概——前辈的话

    gcc+gdb+makefile+vi是一套组合,不能单纯的拆分开来学习. gcc主编译单个文件 gdb调试 makefile用于大型工程解决不同源文件的依赖关系 vi/emacs是编辑器 如果有条件 ...

  4. lzo压缩格式文件查看

    使用lzop命令解压并查看 :lzop -cd xxx.lzo |more 附压缩命令:lzop xxx.log (生成xxx.log.lzo) 其它参数: # lzop -v test # 创建te ...

  5. 2. SpringMVC 上传文件操作

    1.创建java web项目:SpringMVCUploadDownFile 2.在项目的WebRoot下的WEB-INF的lib包下添加如下jar文件 com.springsource.com.mc ...

  6. PXE+kickstart自动安装ubuntu14.04

    本文参考了诸多文章,先感谢这些文章的作者. 使用pxe安装系统需要安装dhcp,tftp,http等服务(当然也可以使用其他文件共享方式比如nfs,ftp). 实验环境: 1. vmware 12 2 ...

  7. PHP strtotime在linux服务器时间延迟8小时问题

    今天客户反映有个功能投票模块第一天投了后,第二天就不能投了,理论上是第二天凌晨就可以再答题的,发现本地是正常的,linux服务器异常, 仔细查找原因发现是strtotime函数获取的值和本地获取的值不 ...

  8. CodeForces 711D Directed Roads

    计数,模拟. 首先观察一下给出的图的特点: $1.$一定存在环. $2.$可能存在多个环. 我们对每个环计算方案数,假设环$C$上包含$x$条边,那么把环$C$破坏掉的方案数有${2^x} - 2$种 ...

  9. .Net 生成二维码【超简易,仅供学习】

    1,首先下载DotNetBarcode.dll文件 下载地址: http://dl.downyi.com/dotnetbarcode_dll.rar 2,调用方式 string path = @&qu ...

  10. 递归——CPS(三)

    JScript不是天然支持CPS,但是可以写一个分发引擎使得能工作在CPS风格下.一般只有一个活动的continuation,所以可以定义规则:JScript CPS 函数允许有返回,但是它们做的最后 ...