当前位置: 首页 > 编程日记 > 正文

JavaScript高级程序设计(第3版)第六章读书笔记

第六章 面向对象的程序设计

1. 数据属性

[[Configurable]]:表示能否通过delete删除属性从而重新定义属性。默认值为true。

[[Enumerable]]:表示能否通过for-in循环返回属性。默认值为true。

[[Writable]]:表示能否修改属性的值,默认为true。

[[Value]]:包含这个属性的数据值。默认为undefined。

要修改属性默认的特性,必须使用ECMAScript5的Object.defineProperty( )方法。接收三个参数:属性所在对象,属性名字和一个描述符对象。其中,描述符对象的属性必须是:configurable、enumerable、writable和value。

可以多次调用Object.defineProperty()方法需改同一属性,但在把configurable特性设置为false之后就会有限制了。

2. 访问器属性

访问器属性不包含数据值,包含一对getter和setter函数。

[[Configurable]]:表示能否通过delete删除属性从而重新定义属性。默认值为true。

[[Enumerable]]:表示能否通过for-in循环返回属性。默认值为true。

[[Get]]:在读取属性时调用的函数,默认值为undefined。

[[Set]]:在写入属性时调用的函数,默认值为undefined。

定义多个属性,ECMAScript5定义了Object.defineProperties()方法。

3. 使用ECMAScript5的Object.getOwnPropertyDescriptor()方法,可以取得给定属性的描述符。此方法接收两个参数:属性所在的对象和要读取其描述符的属性名称。返回值是一个对象。

4. 创建对象

方法

细节

工厂模式

用函数来封装以特定接口创建对象的细节。

优点:可以无数次调用函数。

缺点:但没有解决对象识别的问题。

构造函数模式

没有显示地创建对象;

直接将属性和方法赋给了this对象;

没有return语句。

构造函数始终都以一个大写字母开头,而非构造函数应该以一个小写字母开头。

要创建构造函数的新实例,必须使用new操作符。

优点:构造函数模式胜过工厂模式的地方在于:可以将它的实例标识为一种特定的类型。

缺点:每个方法都要在每个实例上重新创建一遍。

原型模式

每个函数都有一个prototype(原型)属性,此属性是一个指针,指向一个对象,此对象的用途是包含可以由特定类型的所有实例共享的属性和方法。

当为对象实例添加一个属性时,这个属性就会屏蔽原型对象中保存的同名属性,但不会修改那个属性。使用delete操作符则可以完全删除实例属性,能够重新访问原型中的属性。

hasOwnProperty( )方法可以检测一个属性是存在于实例中,还是存在于原型中。只有存在于对象实例中,才会返回true。

单独使用时,in操作符会在通过对象能够访问给定属性时返回true,无论该属性存在于实例中还是原型中。只要in操作符返回true,而hasOwnProperty( )返回false,就可以确定属性时原型中的属性。

hasPrototypeProperty( )方法,当原型属性存在时,返回true,当原型属性被实例重写时,返回false。

在使用for-in循环时,返回的是所有能够通过对象访问的、可枚举的属性,其中既包括存在于实例中的属性,也包括存在于原型中的属性。

重写原型对象切断了现有原型与任何之前已经存在的对象实例之间的联系,他们引用的仍然是最初的原型。

优点:可以让所有对象实例共享它所包含的属性和方法,即不必再构造函数中定义对象实例的信息,而是可以将这些信息直接添加到原型对象中。

缺点:由共享本质,对于包含引用类型值的属性而言问题突出。

组合使用构造函数模式和原型模式

创建自定义的最常见方式,也是用来定义引用类型的默认形式。

实例属性在构造函数中定义,所有实例共享的属性constructor和方法都在原型中定义。

优点:集构造函数与原型模式之所长。

动态原型模式

使用if语句检查初始化之后应该存在的任何属性或方法。采用该模式创建的对象可以用instanceof操作符确定它的类型。

寄生构造函数模式

除了使用new操作符并把使用的包装函数叫做构造函数之外,此模式与工厂模式是一样的。构造函数在不返回值的情况下,默认会返回新对象实例,而通过在构造函数的末尾添加一个return语句,可以重写调用构造函数返回的值。

返回的对象与构造函数或者构造函数的原型属性直接没有关系。

不能依赖instanceof操作符来确定对象类型。

可以使用其他模式,尽量不要使用该模式

稳妥构造函数模式

稳妥对象:没有公共属性,而且其方法也不引用this的对象。

与寄生构造模式的两点不同:一是新创建对象的实例方法不引用this;二是不使用new操作符调用构造函数。

5. OO语言一般支持两种继承方式:接口集成和实现继承。接口集成只继承方法签名,而实现继承则集继承实际的方法。ECMAScript只支持实现继承,且主要依赖原型链来实现。

6. 原型链的基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。

functionSuperType(){

this.property = true;

}

SuperType.prototype.getSuperValue= function( ){

returnthis.property;

}

functionSubType(){

this.subproperty = false;

}

SubType.prototype= new SuperType();

SubType.prototype.getSubValue= function(){

return this.subproperty;

}

instance.getSubValue()     //false

instance.getSuperValue()   //true

7. 所有引用类型默认都集成了Object,而这个继承也是通过原型链实现的。

8. 确定原型和实例的两种方法:一是使用instanceof操作符,用这个操作符来测试实例与原型链中出现过的构造函数,结果就会返回true,第二种方式是使用isPrototypeOf( )方法,只要原型链中出现过的原型,都可以说是该原型链所派生的实例的原型。

9. 给原型添加方法的代码一定要放在替换原型的语句之后,另外,在通过原型链实现继承时,不能使用对象字面量创建原型方法。

10.  继承

方法

实现

原型链

利用原型让一个引用类型继承另一个引用类型的属性和方法。每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。

原型链的两大问题,一是来自包含引用类型值的原型,另一个是在创建子类型的实例时,不能向超类型的构造函数中传递参数。

借用构造函数

使用apply()和call( )方法在新创建的对象上执行构造函数。

优点:相对于原型链而言,可以在子类型构造函数中向超类型构造函数传递参数

缺点:方法都在构造函数中定义,因此函数复用就无从谈起。

组合集成

将原型链和借用构造函数的技术一起,取长处的方式。原理是使用原型链实现对原型属性和方法的集成,而通过借用构造函数来实现对实例属性的继承。

优点:避免了原型链和借用构造函数的缺陷,融合了它们的优点,成为JavaScript中最常用的继承模式。而且,instanceof和isPrototypeOf( )也能够用于识别基于组合继承创建的对象。

缺点:无论什么情况下,都会调用两次超类型构造函数,一次是在创建子类型原型的时候,另一次是在子类型构造函数内部。

原型式继承

此方法没有严格意义上的构造函数,借助原型可以基于已有的对象创建新对象,同时还不必因此创建自定义类型。

ECMAScript通过新增Object.create( )方法规范化了原型式继承。

缺点:包含引用类型值的属性始终都会共享相应的值,就像使用原型模式一样。

寄生式继承

创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再像真的处理之后一样返回对象。

缺点:使用寄生式集成来为对象添加函数,会由于不能做到函数复用而降低效率

寄生组合式继承

通过借用构造函数来继承属性,通过原型链的混成形式来继承方法。基本思路是:不必为了指定子类型的原型而调用超烈性的构造函数,我们所需要的是超类型原型的一个副本而已。即使用寄生式继承来继承超类型的原型,然后再将结果指定给子类型的原型。

优点:效率高,值调用一次超类型原型的构造函数,原型链还能保持不变,能正常使用instanceof和isPrototypeOf( )。是最理想的继承范式。

转载于:https://www.cnblogs.com/rain-123/p/5227688.html

相关文章:

2022-2028年中国钢丸行业市场行情监测及未来前景规划报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国钢丸行业市场行业相关概述、中国钢丸行业市场行业运行环境、分析了中国钢丸行业市场行业的…

[MySQL]Every derived table must have its own alias

2019独角兽企业重金招聘Python工程师标准>>> 关于这条报错信息,意思是指每个派生出来的表都必须有一个自己的别名。 _mysql_exceptions.OperationalError: (1248, Every derived table must have its own alias) 如下两条select语句可以说明这个问题&am…

Java爬取解析去哪儿景点信息

前言:这两周在做 Web 课的大作业,顺便琢磨了一下如何使用 Java 从网上获取一些数据,现在写这篇博客记录一下。 PS:这里仅限交流学习用,如利用代码进行恶意攻击他网站,和作者无关!!&a…

用Unity和C#创建在线多人游戏学习教程

MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz,2 Ch 语言:英语中英文字幕(根据原英文字幕机译更准确) |时长:58节课(6h 41m) |大小解压后:6.1 GB 用Unity和C#创建在线多人游戏以及如何创建基于Turn的多人游戏…

bzoj 1040: [ZJOI2008]骑士 树形dp

题目链接 1040: [ZJOI2008]骑士 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3054 Solved: 1162[Submit][Status][Discuss]Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英。他们劫富济贫,惩恶扬善,受到社会…

2022-2028年中国钢桶行业市场研究及前瞻分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国钢桶行业市场行业相关概述、中国钢桶行业市场行业运行环境、分析了中国钢桶行业市场行业的…

在windows中创建一个影子用户

在windows中创建一个影子用户(看不到图请下载附件)我们可以在windows操作系统中建立一个影子用户,也就是它是实际存在的,但是不会在登录时或者用户组中显示,我们可以赋予影子用户管理员权限,可以在某些情况下管理员不可用时使用。…

PX4初级教程

链接:https://pan.baidu.com/s/1VIQcOQt-I5-evMx1jnV0ZQ 提取码:8niq

用Unity的视频广告创建2D动作游戏 Create Action 2D Game With Video Ads In Unity

MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz,2 Ch 语言:英语中英文字幕(根据原英文字幕机译更准确) |时长:27场讲座(4h 19m) |大小解压后:2.35 GB Unity 2D游戏开发终极指南 你会学到: 学习使用Unity Tile…

大话设计模式之简单的工厂模式

第一章:代码无错就是优-简单的工厂模式 先建立一个计算类Operation Operation.h文件 interface Operation : NSObjectproperty(nonatomic,assign)double numberA;property(nonatomic,assign)double numberB;end Operation.m文件 implementation Operationend 然后分…

Nginx学习3:反向代理实例

Nginx配置实例-反向代理1 目标 打开浏览器,在浏览器地址栏输入地址 www.123.com,跳转到 liunx 系统 tomcat 主页面中 准备工作 我们在官网下载好tomcat之后,直接将tomcat的压缩包放到相应的目录下编译解压,然后进入tomcat的bi…

2022-2028年中国钢铁智能制造产业竞争现状及发展趋势分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国钢铁智能制造行业市场行业相关概述、中国钢铁智能制造行业市场行业运行环境、分析了中国钢…

exchange 2010 search mailbox 的幕后强大功能

铃……….半夜中被一阵急促的手机铃声吵醒,年度服务客户打来电话需要进行邮件的排查和删除工作。问其原因,原来是组织中有人发了一封关于领导的不健康的邮件,并在企业内部进行了转发,领导要求立即找出此类邮件并进行删除。管理员深…

无人机官网介绍

参考官网&#xff1a;http://dev.px4.io/master/en/index.html 程序在运行期间可以通过在shell端输入执行top指令查看哪些模块正在被执行&#xff0c;当运行模块时可以通过输入<moudles name> start/stop来实现模块的使用与停止。 PX4软件架构&#xff1a; 更新速率&am…

Unity从头开始开发增强现实(AR)游戏学习教程

使用Unity 2021构建增强现实飞镖游戏 学习从头开始开发增强现实(AR)游戏&#xff0c;使用AR基金会&#xff0c;货币化&#xff0c;发布游戏玩商店 Build a Augmented Reality Dartboard Game with Unity 2021 你会学到什么 使用Unity2021从头开始学习增强现实。 构建一个AR飞镖…

IDEA的CPU占用率高问题解决方法

前言&#xff1a;这段时间发现 IDEA 的 CPU 占用率猛涨&#xff0c;时不时就飙升到百分之7、80&#xff0c;使得敲代码的体验感十分不佳&#xff0c;在经过一番查找之后终于解决了问题&#xff0c;在此记录一下 IDEA的CPU占用率高问题解决方法 问题定位 我们先定位一下为什么I…

消息队列之库存扣减

转载于:https://www.cnblogs.com/work-at-home-helloworld/p/5230894.html

2022-2028年中国钢铁冶炼行业市场研究及前瞻分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国钢铁冶炼行业市场行业相关概述、中国钢铁冶炼行业市场行业运行环境、分析了中国钢铁冶炼行…

Microsoft Build 2015

没本事去旧金山&#xff0c;只能默默的守在笔记本前看了…… 首先Azure在全球有19个数据中心了&#xff0c;终于超过亚马逊了&#xff0c;好样的&#xff01;过去12个月Azure有超过500个新功能上线&#xff0c;每月用户增长9万。Azure将会越来越成熟了&#xff0c;只可惜我现在…

开源飞控PX4简介

介绍&#xff1a; https://docs.px4.io/master/zh/flight_controller/pixhawk4.html无人机飞控基本装配参考&#xff1a; https://docs.px4.io/master/zh/assembly/下载地面站链接&#xff08;QGC地面站&#xff09;&#xff1a; http://qgroundcontrol.com/downloads/

Unity视觉效果图初学教程 Unity Visual Effects Graph for Beginners

面向初学者的Unity视觉效果图介绍 你会学到: 学生将学习使用视觉效果图来创建效果 MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:39节课(4h 42m…

nonatomic, retain,weak,strong用法详解

strong weak strong与weak是由ARC新引入的对象变量属性ARC引入了新的对象的新生命周期限定&#xff0c;即零弱引用。如果零弱引用指向的对象被deallocated的话&#xff0c;零弱引用的对象会被自动设置为nil。property(strong) MyClass *myObject;相当于property(retain) MyClas…

“ Error:(1, 1) java: 非法字符: ‘\ufeff‘ ”错误的解决方法

前言&#xff1a;今天为了做作业&#xff0c;在 github 上面下载了个项目&#xff0c;然后在运行项目时发现报错&#xff0c;在此记录一下 “ Error:(1, 1) java: 非法字符: ‘\ufeff’ ”错误的解决方法 发生原因 这个项目从目录的结构可以很明显地看出是使用 Eclipse 开发的…

2022-2028年中国钢铁电商产业竞争现状及发展前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国钢铁电商行业市场行业相关概述、中国钢铁电商行业市场行业运行环境、分析了中国钢铁电商行…

java开发webservice的几种方式

为什么80%的码农都做不了架构师&#xff1f;>>> webservice的应用已经越来越广泛了&#xff0c;下面介绍几种在Java体系中开发webservice的方式&#xff0c;相当于做个记录。 1.Axis2 Axis是apache下一个开源的webservice开发组件&#xff0c;出现的算是比较早了&a…

改变gazebo背景颜色

修改这里:

【Unity教程】创建一个完整的驾驶游戏

专业游戏设计 你会学到什么 在unity HDRP创建一个完整的驾驶游戏 定制不同类型的汽车 将人工智能汽车和人工智能航路点系统添加到你的赛道上 添加汽车展厅菜单以解锁和购买新车 在Blender中设计自己的赛道 易于理解的编码使游戏工作 流派:电子学习| MP4 |视频:h264&#xff0c…

哈夫曼编译码器

前言&#xff1a;又到了学校一年一度的数据结构课设的日子&#xff0c;经不住学弟学妹热心地“询问”我数据结构课设的内容&#xff0c;我就在这里把我之前数据结构课设做的东西总结一下 哈夫曼编译码器 我课设选择的题目是哈夫曼编译码器&#xff0c;类似于我们平时用的解压缩…

Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)

题意&#xff1a; 线段树做法 分析&#xff1a; 因为每次都是在当前位置的前缀区间查询最大值&#xff0c;所以可以直接用树状数组优化。比线段树快了12ms~ 代码&#xff1a; #include<cstdio> #include<cmath> #include<iostream> #include<algorithm>…

2022-2028年中国钢筘行业市场研究及前瞻分析报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国钢筘行业市场行业相关概述、中国钢筘行业市场行业运行环境、分析了中国钢筘行业市场行业的…