文章目录

  • 一、对象
    • 1、创建对象
      • 工厂模式创建对象
      • 构造函数模式
      • 原型模式
    • 2、属性的类型(数据属性和访问器属性)
      • 修改默认的数据属性:Object.defineProperty()和Object.defineProperties()
      • 读取属性的特性:Object.getOwnPropertyDescriptor()和Object.getOwnPropertyDescriptors()
      • 合并对象,使用Object.assign()方法:
      • 对象标识及相等判定:Object.is()
      • 增强的对象语法
    • 3、继承
      • 3.1 原型链
      • 3.2 盗用构造函数(对象伪装、经典继承)
      • 3.3 原型式继承
      • 3.4 组合继承(伪经典继承)综合了原型链和盗用构造函数
      • 3.4 原型式继承
      • 3.5 寄生式继承
      • 3.6 寄生式组合继承
  • 2、类
    • 2.1 类定义
      • 2.1.1 函数和类定义的异同:
      • 2.1.2 类的构成
    • 2.2 类构造函数

一、对象

对象是一组没有特定顺序值的集合。

1、创建对象

通常是new一个Object实例,然后给它添加属性和方法:

更流行的是用对象字面量方法,更为简洁,和前面创建的对象是等价的。

工厂模式创建对象

new一个object和对象字面量创建虽然方便,但创建具有同样接口的多个对象会发现有很多重复的代码很多,于是有了工厂模式。

我们拿创建多个学生来举个栗子。

构造函数模式

 没有显式地创建对象。
 属性和方法直接赋值给了 this。
 没有 return。

注:一般构造函数名首字母大写。
构造函数也是函数,任何函数只要使用了new操作符调用就是构造函数。

原型模式

每个函数都会创建一个prototype属性对象,包含实例共享的属性和方法,这个对象就是通过调用构造函数创建的对象的原型。默认情况下,所有原型对象自动获得一个constructor 的属性,指回与之关联的构造函数。

  • Object.getPrototypeOf(),返回参数的内部特性[[Prototype]]的值;
  • Object.setPrototypeOf,可以向实例的私有特性[[Prototype]]写入一个新值;
  • Object.hasOwnProperty,可以的得知访问的是实例属性还是原型属性;
  • Object.getOwnPropertyDescriptor(),只对实例属性有效;
  • Object.keys(),可获得对象上所有可枚举的实例属性。

2、属性的类型(数据属性和访问器属性)

数据属性包含一个保存数据值的位置,值会从这个位置读取和写入,有4个特性描述它们的行为。

  • [[Configurable]]:表示属性是否可以通过 delete 删除并重新定义,是否可以修改它的特
    性,以及是否可以把它改为访问器属性。默认true。
  • [[Enumerable]]:表示属性是否可以通过 for-in 循环返回。默认true。
  • [[Writable]]:表示属性是否可以被修改。默认true。
  • [[Value]]:包含属性实际的值,读取和写入属性值得位置。默认undefined。
修改默认的数据属性:Object.defineProperty()和Object.defineProperties()

想要修改这些默认的数据属性,需要用 Object.defineProperty()方法。方法接受三个参数(对象,属性名称和描述符对象),比如:

将name属性的Writable置为false之后可见修改name并没有修改成功。

将name属性的Configurable置为false之后可见删除name并没有删除成功。此处注意将一个属性configurable置为false是不可逆的,该属性设置为不可配置后不能再配置了。

访问器属性不包括数据值,包含一个获取(getter)函数和一个设置(setter)函数,不过这两个函数不是必需的,访问器属性有 4 个特性描述它们的行为。

  • [[Configurable]]:表示属性是否可以通过 delete 删除并重新定义,是否可以修改它的特
    性,以及是否可以把它改为访问器属性。默认true。
  • [[Enumerable]]::表示属性是否可以通过 for-in 循环返回。默认true。
  • [[[Get]]:获取函数,在读取属性时调用。默认值为 undefined。
  • [[[Set]]:设置函数,在写入属性时调用。默认值为 undefined。
    和数据属性一样,必须使用Object.defineProperty()修改。

    year_中的下划线常用来表示该属性并不希望在对象方法的外部被访问。另一个属性 year 被定义为一个访问器属性,其中获取函数简单地返回 year_的值,而设置函数会做一些计算以决定正确的版本(a)。

定义多个属性时,可用Object.defineProperties()方法,可一次性定义多个属性:

读取属性的特性:Object.getOwnPropertyDescriptor()和Object.getOwnPropertyDescriptors()

读取某个属性的特性,使用 Object.getOwnPropertyDescriptor(对象,属性名称)方法:
读取所有属性的特性,使用 Object.getOwnPropertyDescriptors(对象)方法:

合并对象,使用Object.assign()方法:


Object.assign()实际上对每个源对象执行的是浅复制,如果不想改变原有的对象,需要第二种写法。

对象标识及相等判定:Object.is()

增强的对象语法

1、属性值简写
属性名和变量名一样的时候,可简写

2、可计算属性
有了可计算属性,就可以在对象字面量中完成动态属性赋值。

3、简写方法名

4、对象解构
不使用对象解构:

使用对象解构:

遇到不存在的属性,则为undefined,也可以同时定义默认值。

解构在内部使用函数ToObject()(不能在运行时环境中直接访问)把源数据结构转换成对象。所以null和undefined不能被解构。

也可以事先声明变量,后解构对象赋值,不过表达式必须用括号括起来:

嵌套解构:(可用于浅拷贝对象)

部分解构:
多属性一起解构,有一个出错,可能会只完成一部分的解构

3、继承

很多面向对象语言都支持两种继承:

  • 接口继承(只继承方法签名)
  • 实现继承(只继承实际的方法)
    ECMAScript中函数没有签名,所以实现继承是ECMAScript 唯一支持的继承方式,主要通过原型链实现。

3.1 原型链

ECMA-262 把原型链定义为 ECMAScript 的主要继承方式。

3.2 盗用构造函数(对象伪装、经典继承)


每一个实例都会有自己的colors属性,盗用构造函数的主要缺点,必须在构造函数中定义方法,不可重用,只能用构造函数模式。

3.3 原型式继承


相当于浅复制,两个实例和obj1共用继承的原型obj1的frends,数据同步。
ES5增加的Object.create()方法来实现原型式继承,这个方法接收两个参数:作为新对象原型的对象,以及给新对象定义额外属性的对象(第二个可选)。

3.4 组合继承(伪经典继承)综合了原型链和盗用构造函数

组合继承弥补了原型链和盗用构造函数的不足,是JavaScript中使用最多的继承模式。而且组合继承也保留了instanceof操作符和isPrototypeOf()方法识别合成对象的能力。

3.4 原型式继承

原型式继承本质上执行了一次浅复制,比如我有一个对象,然后在对象的基础上创建了新对象,修改新对象会影响原对象引用值属性。

object()和Object.create()使用效果一致(后面的Object的O是大写哦)

3.5 寄生式继承

与原型式继承比较接近,寄生式继承背后的思路类似于寄生构造函数和工厂模式:创建一个实现继承的函数,以某种方式增强对象,然后返回这个对象。

3.6 寄生式组合继承

2、类

2.1 类定义

与函数类型相似,定义类也有两种主要方式:类声明和类表达式。

2.1.1 函数和类定义的异同:

同:函数表达式和类表达式 在求值前都不能引用

异1:函数声明可以提升,类声明不可以提升:

异2:函数受函数作用域限制,而类受块作用域限制:

2.1.2 类的构成

类可以包括构造函数方法、实例方法、获取函数、设置函数和静态方法,也可以为空的类定义。(类名建议大写)
类表达式的名称式可选的,可以通过name的属性获取类表达式的名称字符串,但不能在类表达式作用域外访问到这个标识符。

2.2 类构造函数

constructor关键字用于在类定义块内部创建类的构造函数。
new实例化类时,有constructor则将直接执行该函数

类构造函数没有特殊之处,实例化后也会转成普通的实例化方法;类构造函数和普通构造函数主要的区别是,调用类构造函数必须使用new操作符,否则会报错。
如图:


待更...

JavaScript高级程序设计(第4版)学习随笔【第八章】相关推荐

  1. JavaScript高级程序设计第四版学习--第二十四章

    title: JavaScript高级程序设计第四版学习–第二十四章 date: 2021-5-31 10:46:01 author: Xilong88 tags: JavaScript 本章内容: ...

  2. JavaScript高级程序设计第三版.CHM【带实例】

    从驱动全球商业.贸易及管理领域不计其数的复杂应用程序的角度来看,说 JavaScript 已经成为当今世界上最流行的编程语言一点儿都不为过. JavaScript 是一种非常松散的面向对象语言,也是 ...

  3. JavaScript高级程序设计[第3版]

    JavaScript高级程序设计[第3版] package xyz.huning.toolkit.pdf;import java.io.FileOutputStream; import java.io ...

  4. Js高级程序设计第三版学习(十二章)

                                  Js高级程序设计第三版学习(十二章) 第十二章 DOM2和DOM3   1.样式: 访问样式属性 任何支持style特性的HTML元素都有一 ...

  5. JavaScript高级程序设计 第4版----String

    JavaScript高级程序设计 第4版----String 文章目录 JavaScript高级程序设计 第4版----String 1.JavaScript 字符 2.字符串操作方法 1.conca ...

  6. 《JavaScript高级程序设计 第3版》-学习笔记-1

    P1-P30页 1.<script>标签的属性 async:async(html)  | async="async"(xhtml),表示立即下载脚本,但不马上执行(执行 ...

  7. 新书-JavaScript高级程序设计:第2版(预订中,估价)

    http://www.china-pub.com/196857 JavaScript的应用在广度和深度上日益扩大和加深,前端开发亟待掌握的JavaScript技能也越来越具有挑战性. 这个新版本几乎全 ...

  8. javascript高级程序设计 第三版

    网盘地址 提取码:vh81 笔记 第二章 2.1script标签 <script>元素属性:async.charset.defer.language.src.type async和defe ...

  9. JavaScript高级程序设计红宝书学习笔记第三章基本概念

    第三章 基本概念 本章内容 语法 数据类型 操作符 语句 函数 3.1 语法 3.1.1 区分大小写,ECMAScript中的一切(变量.函数名和操作符)都区分大小写. 3.1.2 标识符 标识符:变 ...

  10. JavaScript高级程序设计第三版 第3章 基本概念

    第3章 基本概念 3.1 语法 3.1.1 区分大小写 3.1.2 标识符 3.1.3 注释 3.1.4 严格模式 3.1.5 语句 3.2 关键字和保留字 3.3 变量 3.4 数据类型 3.4.1 ...

最新文章

  1. 上海交大机试真题—最短路径(最小生成树解法)
  2. 除了芯片 我们还应关注哪些核心技术
  3. php链接javascript,javascript - 添加类=“行为链接”到活动页面 - PHP或JS - SO中文参考 - www.soinside.com...
  4. Android安全笔记-Service基本概念
  5. eclipse java类图_eclipse中。green UML 自动生成类图
  6. 反序列化对象列表发生异常_Apache Thrift系列详解:序列化机制
  7. LeetCode 5352. 生成每种字符都是奇数个的字符串
  8. Web Components系列(七) ——自定义组件的生命周期
  9. python selenuim使用代理的方式
  10. layer normalization 缺点_【收藏贴】不同种类质谱仪优缺点分析对比!
  11. php 导入excal,php导入excel php使用phpexcel导入excel文件
  12. 5.9拉普拉斯矩阵的谱分解,谱图卷积,图卷积演变过程
  13. 谈一谈|《黑神话:悟空》实机演示观后感
  14. 中国历史人物传记数据库 CBDB 若干表简介
  15. 微信小程序中如何打开公众号文章(node版)
  16. PS 图片部分位置调亮
  17. AI插画师:生成对抗网络
  18. 使用neon实现RGB888转RGB565
  19. FFmpeg从入门到精通命令
  20. 计算机基础excel重点,计算机基础重点 (Excel ppt 网络基础)

热门文章

  1. chirp和tone burst信号激励
  2. 嵌入式(stm32)学习之路---MIDI音乐播放器
  3. 项目里的UT越来越慢,怎么办?
  4. 原码、反码、补码、移码 基本介绍
  5. Windows下安装Redis及可视化工具
  6. hadoop安装与启动
  7. java内存可视化_JVM系列(六)、可视化工具介绍
  8. 企业微信app中退出某个企业 最新版 图文
  9. 2022上半年系统分析师必考知识点
  10. 微信小程序--计算器demo实现