本章介绍对象。

在学习Java时,对象理解为公共事物的抽象,实例为具体的个例,对象为抽象的概念,例如人为抽象的概念,具体的个例为张三,李四。

Java对象种类多,包含普通类,JavaBean,注解,枚举,接口,抽象类。每种类的特点也不同。对象之间的关系很多,泛化,实现,依赖,关联,组合,聚合。可以创建很复杂的类结构,例如IO框架,集合框架。每个对象都有强,弱,虚引用的概念,生命周期的概念。还需要考虑多线程下对象属性的安全性,总之很复杂。

而JS的对象,虽然概念相同,但它理解起来非常简单,是属性的容器,包含key-value键值对。它拥有原型对象,可以实现对象的继承,封装。构建复杂的模块(easyUI框架)等。由此可见JS对象也很强大。

本章的内容不再依照书籍原始的结构,而是将其分为两类知识点,对象容器本身和容器的元素属性。

容器:

  1. 操作:创建,类型判断
  2. 概念:引用类型,原型链,全局对象

属性:

  1. 操作:访问,修改,删除,判断,遍历。
  2. 概念:get & set属性未提及,属性的元属性未提及。

书籍的原始结构为

  1. 第一小节介绍通过字面量创建对象。
  2. 第二小节介绍访问对象的属性
  3. 第三小节介绍修改对象的属性
  4. 第四小节介绍对象是引用类型。
  5. 第五小节介绍对象的原型链。
  6. 第六小节介绍如何判断对象的具体类型
  7. 第七小节介绍遍历对象中的属性。
  8. 第八小节介绍删除对象中的属性
  9. 第九小节介绍如何合理的创建全局变量。

1、对象(容器)

1.1 创建 

第一小节介绍对象创建的方式。JS创建对象的方式有两种,构造器和字面量,作者推荐只使用字面量方式,它的格式为{prop:value},

  • prop是属性的名称,不包含特殊字符,不是关键字,如果是需要添加引号。
  • value是属性值,可以是数据类型的字面量,函数,对象,数组等等。

1.2 引用类型

  对象是引用类型,意味着它只是保留着访问内存中数据的链接。类似于超链接,当引用地址改变时,相当于超链接的目标地址改变。当数据改变时,相当于目标的内容发生了改变。

<a id="link" href="https://www.baidu.com">链接</a>
// 当引用地址改变时,相当于href属性改变,但是还是同一个a标签。例如将baidu.com改为sina.com
// 当数据发生改变时,相当于百度主页的内容发生了改变。

1.3 类型判断 

JS判断具体类型的方法有以下几种

  1. 根据对象的class属性。自定义的对象class属性的值未必会是对象的名称。
  2. 根据对象构造器。必须保证在同一个上下文中。
  3. 根据对象构造器的名称。最优解。
  4. 使用typeof进行判断时,它无法定位到具体的类型,只能区分基本数据类型和引用类型。
  5. l  使用instanceof进行判断时,它必须保证运行在同一个上下文中,拥有相同的全局变量。而且它无法区分父类和子类

1.4 原型链

prototype是对象的原型链,是JS实现面向对象的基石。很难想象仅凭prototype属性就可以实现继承,封装,模块化等概念,但是确实是做到了。

每一个对象都有相应的原型链对象,对象可以继承原型链中的属性和方法,这是实现继承的关键。

当访问对象的属性时,会经历以下几个步骤。

  1. 首先在实例中查找是否存在属性,找到即返回,找不到继续步骤2
  2. 在实例的原型链中查找属性,找到即返回,找不到继续在步骤3
  3. 实例原型链也是一个对象,在该对象的原型链中查找,直到该对象为Object.prototype。Object.prototype的原型链为null。
  4. 如果遍历完整个原型链,还未找到属性,返回undefined。

原型链的结构与链表的结构相似,每一个原型链都有下一个原型链对象的引用。

遍历原型链的过程与遍历迭代器很相似。迭代器的终止条件时next() == null;原型链的终止条件为Object.getPrototypeOf(arg) == null,JS的所有对象都有原型链,满足这一条件的只有Object.prototype。

1.5 全局对象

  全局对象可以在任何代码中可见,而且可以随意修改,一方面它很方便,只需要在全局对象上添加属性,属性值为自定义对象,这样就可以在其他地方随意使用自定义对象。另一方面它很糟糕,因为任何其他代码都可以修改全局变量,这可能导致使用全局变量的代码发生错误,或者是被覆盖,直接导致自定义对象不可用。所以在自定义全局对象时,须遵循

  • 在命名时尽可能定义唯一的名称,格式为org.app.module.variable。第一级为机构,第二级为应用,第三级为应用模块,第四级为模块内的某个变量。
  • 尽可能限制其他人对自定义对象的修改和属性的修改,可以通过Object的方法,属性的元属性来限制。

2、属性(元素)

2.1 访问

访问属性的方式有dot和[]两种方式,它们的区别是

  • Dot方式更简洁,当属性名中存在特殊字符,或是特殊关键字时,会出错。
  • []方式弥补了dot的缺点,属性名可以是任意的特殊字符,而且可以是表达式,函数,对象等等。列举以下几种情况
  1. 当为expression时,会计算expression的值,最常见的是++,-- 。[index++]较为常见
  2. 当为特殊字符时,例如属性名中存在空格,[”hello message”]
  3. 当为关键字时,例如[“delete”]
  4. 当为函数时,首先会执行函数,并将返回值作为属性名,当无返回值时,相当于[“undefined”]。这种情况下会存在安全问题,导致脚本注入。
  5. 当为对象时,例如ES6中的Symbol.iterator,只能通过[]访问。

2.2 修改

使用prop=value的方式修改属性

  • 若属性不存在,且对象的extensible属性为true时,添加新属性,当extensible属性为false时,该表达式无任何效果。
  • 若属性存在,且属性的元属性writable值为true时,使用新值替换旧值,当为false时,该表达式无任何效果

2.3 删除

  使用delete关键字删除属性,只能删除自身的属性,无法删除继承来的属性。

  • 当属性不存在时,无任何效果。
  • 当属性存在时,且属性的元属性configurable为true时,删除成功,为false时,删除失败,返回false。

delete在删除失败时返回false,其他情况都返回true,意味着即使属性不存在也返回true。

当删除的属性在对象的原型链中存在时,删除对象的属性,导致原型链中的属性可见。

2.4 判断

使用hasOwnProperty方法判断属性是否是对象的自身属性。

根据obj.prop === undefined来判断属性是否存在于对象的原型链中。

2.5 遍历

使用for in语句遍历对象中的属性,这些属性包括继承的属性。

如果只想遍历自身的属性,可以通过hasOwnProperty方法进行过滤。

如果只想要特殊类型的属性,例如只要字符串属性,typeof obj.prop === ”value”进行判断,如果只要非函数属性,使用typeof obj.prop !== ”function”进行过滤。

前端——语言——Core JS——《The good part》读书笔记——第三章节(Object)的更多相关文章

  1. 前端——语言——Core JS——《The good part》读书笔记——初篇

    本书是一本经典,优秀的JS书籍. 目的 在书籍中作者多次提及本书的目的,让读者去发现语言中的精华部分,避免糟粕部分,提高代码的编写质量.简述为取其精华去其糟粕. 本书的内容只涉及到Core JS部分, ...

  2. 前端——语言——Core JS——《The good part》读书笔记——第九,十章节(Style,Good Features)

    第九章节 本章节不再介绍知识点,而是作者在提倡大家培养良好的编码习惯,使用Good parts of JS,避免Bad parts of JS.它是一篇文章. 本文的1-3段阐述应用在开发过程中总会遇 ...

  3. 前端——语言——Core JS——《The good part》读书笔记——第一章节(Good Parts)

    本章是引言,有四个小节,具体内容如下: 第一小节 第一小节介绍作者的观点,作者编写本书的目的. 原文:I discovered that I could be a better programmer ...

  4. 前端——语言——Core JS——《The good part》读书笔记——第四章节(Function)

    本章介绍Function对象,它是JS语言最复杂的内容. Java语言中没有Function对象,而是普通的方法,它的概念也比较简单,包含方法的重载,重写,方法签名,形参,实参等. JS语言中的Fun ...

  5. 前端——语言——Core JS——《The good part》读书笔记——第五章节(Inheritance)

    本章题目是继承,实质上介绍JS如何实现面向对象的三大特性,封装,继承,多态.本章的最后一个小节介绍事件. 与Java语言对比,虽然名称同样称为类,对象,但是显然它们的含义存在一些细微的差异,而且实现三 ...

  6. 前端——语言——Core JS——《The good part》读书笔记——第七章节(正则)

    本章介绍正则表达式的内容.正则表达式是一门独立的语言,它拥有自己的语法规则,在学习本章之前需要了解基本的语法规则. 正则表达式是通用的,意味着同样的语法规则可以适用于不同的编程语言,相同的正则表达式在 ...

  7. 前端——语言——Core JS——《The good part》读书笔记——第六章节(Arrays)

    本章介绍数组的内容,Java中的数组在创建时,会分配同等大小的内存空间,一旦创建数组的大小无法改变,如果数据超过数组大小,会进行扩容操作.并且数组的元素类型在创建时必须是已知的,而且只能存放相同数据类 ...

  8. 前端——语言——Core JS——《The good part》读书笔记——第八章节(Methods)

    本章介绍JS核心对象的方法.这些对象包括Array,Function,Number,Object,RegExp,String.除这些常用的核心对象还有Date,JSON. 本章更偏向于API文档,介绍 ...

  9. 前端——语言——Core JS——《The good part》读书笔记——附录三,四,五(JSLint,铁路图,JSON)

    1.JSLint 本书的JSLint部分只是一个引言,详细了解该工具的使用参考http://www.jslint.com/ 2.铁路图 在本书中使用过的铁路图集中放在这部分附录中,其实读完本书之后,没 ...

随机推荐

  1. spring项目启动报错

    个人博客 地址:http://www.wenhaofan.com/article/20180921134534 错误信息 ERROR [localhost-startStop-1] - Context ...

  2. QuerySet的常用方法

    QuerySet常用方法 使用 connection.queries 可以查看sql语句 filter 将满足条件的结果返回,返回值为QuerySet对象 exclude 将满足条件的结果过滤掉,返回 ...

  3. Tomcat的使⽤

    准备 1.官⽹地址:http://tomcat.apache.org下载. 2.解压文件,并放到指定路径,给该文件授权. chmod -R 755 3.启动和停止 进入到/Users/lucas/Do ...

  4. Java 在程序中输入输出

    本周主要学习了Java如何在程序中进行输入和输出,主要分为以下三种: 一.文本界面的输入与输出 1. 使用 javva.util.Scanner 类 2. 使用 in 及 out 二.图形界面的输入与 ...

  5. AcWing 1022. 宠物小精灵之收服 二维费用背包

    #include<iostream> using namespace std ; ; int f[N][N]; int V1,V2,n; int main() { cin>>V ...

  6. AcWing 1012. 友好城市

    #include<iostream> #include<algorithm> using namespace std ; typedef pair<int,int> ...

  7. Codeforces Round #601 (Div. 2) C League of Leesins

    把每一次输入的一组数字存下来,然后把每个数字出现的组数存下来 然后找只出现过一次的数字a,那么这个数字a不是开头就是结尾,默认为开头(是哪个都无所谓),然后去找和它出现在同一组的两个数字b和c,而b和 ...

  8. Web渗透测试思路整理

    信息收集: 域名/IP 子域名列表 whois: 注册地址,注册人,联系方式等 whois反查: 同ip有哪些站点(旁注),同一个注册人注册了哪些域名 社工注册人信息 指纹识别: 操作系统及版本 数据 ...

  9. vue老项目升级vue-cli3.0

    第一步我们卸载全局的vue2.0然后: 打开命令行 输入npm install -g @vue/cli-init   这个就是会安装全局的vue3.0版本.安装好之后我们也可以vue -V查看当前vu ...

  10. OrCAD 16.6 自建仿真模型

    今天仿真用到一个三极管,NXP的MMBT2222A,OdCAD自带的库里没找到,于是打算学着自己建立一个仿真模型 http://www.nxp.com/documents/spice_model/MM ...