6面向对象的程序设计

ECMA_262把对象定义为:无序属性的集合,其属性可以包含基本值、对象或者函数。

6.1理解对象

特性(attribute)是内部值,描述了属性(property)的各种特性。ECMAScript中有两种属性:数据属性和访问器属性。数据属性包含一个数据值的位置,在这个位置可以读取和写入值,数据属性有4个描述其行为的特性,[[Configurable]],[[Enumerable]],[[Writable]],[[Value]].要改变属性默认的特性,必须使用ECMAScript5的Object.defineProperty()方法,这个方法接收3个参数:属性所在的对象、属性的名字和一个描述符对象,一旦把属性定义为不可配置的,就不能再把它变回可配置了。访问器属性不包含数据值,它们包含一对getter和setter函数,访问器属性有4个特性:[[Configurable]],[[Enumerable]],[[Get]],[[Set]].

Object.defineProperties()方法可以一次定义多个属性。

Object.getOwnProperyDescriptor()方法,可以取得给定属性的描述符,这个方法接收两个参数:属性所在的对象和要读取其描述符的属性名称。

6.2创建对象

工厂模式用函数来封装以特定接口创建对象的细节。工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题(即怎样知道一个对象的类型)。

使用构造函数模式可以定义自定义对象类型的属性和方法。按照惯例,构造函数始终都应该以一个大写字母开头,而非构造函数则应该以一个小写字母开头。创建自定义的构造函数意味着将来可以将它的实例标识为一种特定的类型,而这正是构造函数模式胜过工厂模式的地方。构造函数与其他函数的唯一区别,就在于调用它们的方式不同,任何函数,只要通过new操作符来调用,那它就可以作为构造函数。使用构造函数的主要问题,就是每个方法都要在每个实例上重新创建一遍。

我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含由特定类型的所有实例共享的属性和方法。使用原型对象的好处是可以让所有对象实例共享它所包含的属性和方法。与构造函数模式不同的是,新对象的这些属性和方法是由所有实例共享的。只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象,所有原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含一个指向prototype属性所在函数的指针。连接存在于实例和构造函数的原型对象之间,而不是存在于实例和构造函数之间。Object.getPrototypeOf()方法返回[[Prototype]]的值。可以通过对象实例访问保存在原型中的值,但却不能通过对象实例重写原型中的值,当为对象实例添加一个属性时,这个属性就会屏蔽原型对象中保存的同名属性,使用delete操作符则可以完全删除实例属性,从而让我们能够重新访问原型中的属性。使用hasOwnProperty()方法可以检测一个属性是否存在于实例中,还是存在于原型中(在对象实例中,才会返回true)。有两种方式使用in操作符:单独使用和在for-in循环中使用。单独使用时,in操作符会通过对象能够访问给定属性是返回true,不论该属性存在于实例中还是原型中。在使用for-in循环时,返回的是所有能够通过对象访问、可枚举的(enumerated)属性,其中即包括存在于实例中的属性,也包括存在于原型中的属性。Object.keys()方法可以取得对象上所有可枚举的实例属性。Object.getOwnPropertyNames()方法可以得到所有实例属性,无论是否可枚举。用对象字面量来重写原型对象,constructor属性也就变成了新对象的constructor属性(指向Object构造函数),不再指向Person函数。重写原型对象切断了现有原型与任何之前已经存在的对象实例之间的联系。原型模式省略了为构造函数传递初始化参数这一环节,结果所有实例在默认情况下都取得相同的属性值,原型模型最大问题是由其共享的本性多导致的。

创建自定义类型的最常见方式,就是组合使用构造函数模式与原型模式,构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性。

动态原型模型把所有信息都封装在了构造函数中,而通过在构造函数中初始化原型(仅在必要的情况下),有保持了同时使用构造函数和原型的优点。换句话说,可以通过检查某个应该存在的方法是否有效,来决定是否需要初始化原型。

寄生构造函数模式的基本思想是创建一个函数,该函数的作用仅仅是封装创建对象的代码,然后在返回新创建的对象。返回的对象与构造函数或者与构造函数的原型属性之间没有关系。

所谓稳妥对象,指的是没有公共属性,而且其方法也不引用this的对象。稳妥对象最适合在一些安全的环境,或者在防止数据被其他应用程序改动时使用。

6.3继承

ECMAScript中描述了原型链概念,并将原型链作为实现继承的主要方法。其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。所有函数的默认原型都是Object的实例,因此默认原型都会包含一个内部指针,指向Object.prototype。使用instanceof操作符和isPrototypeOf()方法可以确定原型和实例之间的关系,只要是实例和原型链中出现过的构造函数,结果就会返回true。再通过原型链实现继承时,不能使用对象字面量创建原型方法,因为这样做就会重写原型链。原型链最主要的问题来自包含引用类型值的原型,第二个问题是在创建子类型的实例时,不能向超类型的构造函数中传递函数,实际上,应该说是没有办法在不影响所有对象实例的情况下,给超类型的构造函数传递参数。

借用构造函数的基本思想是在子类型构造函数的内部调用超类型构造函数。相对于原型链而言,借用构造函数有一个很大的优势,即可以在子类型构造函数中向超类型构造函数传递参数。如果仅仅是借用构造函数,那么也将无法避免构造函数模式存在的问题——方法都在构造函数中定义,因此函数复用就无从谈起了。

组合继承值得是将原型链和借用构造函数的技术组合到一起,其背后的思路是使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承,这样,既通过在原型上定义方法实现了函数复用,有能保证每个实例都有它自己的属性。

原型式继承要求必须有一个对象可以作为另外一个对象的基础。如果有这么一个对象的话,可以把它传递给object()函数,然后在根据具体需求对得到的对象加以修改即可。Object.create()方法规范化了原型式继承,这个方法接收两个参数:一个用作新对象原型的对象和(可选的)一个为新对象定义额外属性的对象。包含引用类型值的属性时钟都会共享相应的值,就像使用原型模式一样。

寄生式继承的思路与寄生构造函数和工厂模式类似,即创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再像真地是它做了所有工作一样返回对象。在主要考虑对象而不是自定义类型和构造函数的情况下,寄生继承也是一种有用的模式。

 

转载于:https://www.cnblogs.com/dingzibetter/p/6296908.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/402267.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DPM 2012 SP1---安装并部署DPM 2012 SP1服务器

实验拓扑图:一、前提条件:需要在DPM2012 SP1服务器上完成以下操作:1.DPM服务器加入域(使用域管理员登陆DPM2012 SP1服务器)2.准备存储磁盘(新添加一块硬盘)3.关闭防火墙服务(DPM服务…

Linux下tail命令使用

linux tail命令用途是依照要求将指定的文件的最后部分输出到标准设备,通常是终端,通俗讲来,就是把某个档案文件的最后几行显示到终端上,假设该档案有更新,tail会自己主动刷新,确保你看到最新的档案内容。 一…

城市编号(省和市)

备注:这里只是个人的观点,有的地方也是copy,多多指教,个人笔记,有侵犯你们版权的地方还望海涵!!! "qq": [ { "describe_content": "省", "type&…

Linux下test命令使用

test命令格式: [cpp] view plain copy test condition 通常,在if-then-else语句中,用[]代替,即[ condition ]。注意:方括号两边都要用空格。 1、数值比较 比 较 描 述 ---------------------------------------…

用Mysql网页式管理工具安全地访问数据库的方法

2019独角兽企业重金招聘Python工程师标准>>> 用Mysql网页式管理工具安全地访问数据库的方法 在使用通达OA系统时很多用户需要借助Mysql网页式管理工具进入后台数据库去查看数据,进行一些相应的操作。但是大多数时候用户安装完该工具后都是直接进入后台数…

Shell 脚本编程之基础

最近闲着无聊&#xff0c;把笔记写在这吧 0x00 特殊符号和常见的运算符 <1>特殊符号 $*&#xff1a;命令行所有参数组成的字符串 $&#xff1a;命令行所有参数组成的字符串 $n&#xff1a;n位数字&#xff0c;$0表示命令名称&#xff0c;$1表示命令行第一个参数&#xff…

Linux 下的DMA浅析

DMA是一种无需CPU的参与就可以让外设和系统内存之间进行双向数据传输的硬件机制。使用DMA可以使系统CPU从实际的I/O数据传输过程中摆脱出来&#xff0c;从而大大提高系统的吞吐率。DMA经常与硬件体系结构特别是外设的总线技术密切相关。 一、DMA控制器硬件结构 DMA允许外围设备…

Node.jsNPM的安装与配置(转)

Node.js安装与配置 Node.js已经诞生两年有余&#xff0c;由于一直处于快速开发中&#xff0c;过去的一些安装配置介绍多数针对0.4.x版本而言的&#xff0c;并非适合最新的0.6.x的版本 情况了&#xff0c;对此&#xff0c;我们将在0.6.x的版本上介绍Node.js的安装和配置。&#…

从值栈中获取数据

使用struts2的标签ognl表达式获取值栈数据 <s:property value"ognl表达式"/> 一、获取字符串 示例 打印后台string变量的值 jsp页面 Java代码 二、获取对象 示例 打印user对象的userName与userPwd的值 jsp页面 java代码 三、获取list集合 Java代码 1.通过list[…

SQL 事务

事务的acid理解简介ACID&#xff0c;是指在可靠数据库管理系统&#xff08;DBMS&#xff09;中&#xff0c;事务(transaction)所应该具有的四个特性&#xff1a;原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isola…

网络协议复习

不同协议所属的层次如下图&#xff1a; IP IP地址一开始是分类编址&#xff0c;到了20世纪90年代更换为无分类编址。分类编址时IP地址共有五类ABCDE。对于ABC类地址&#xff0c;IP地址都可以划分为网络标识和主机标识。从一个IP地址中提取网络地址要用网络掩码和IP地址进行与运…

CSDN-markdown编辑器使用手册

Markdown手册欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也…

Office 365身份认证管理-添加并验证联合认证域

首先需要安装MicrosoftOnlineServicesSign-inAssistant接受许可并安装安装完成接着安装WindowsAzureActiveDirectoryModuleforWindowsPowerShell安装程序启动接受许可设置安装路径开始安装安装完毕登陆并打开office365管理中心&#xff0c;选择添加一个域开始域添加向导输入我们…

Linux 驱动面试题总结

1、 Linux设备中字符设备与块设备有什么主要的区别&#xff1f;请分别列举一些实际的设备说出它们是属于哪一类设备。 字符设备&#xff1a;字符设备是个能够像字节流&#xff08;类似文件&#xff09;一样被访问的设备&#xff0c;由字符设备驱动程序来实现这种特性。字符设备…

codevs1040统计单词个数(区间+划分型dp)

1040 统计单词个数 2001年NOIP全国联赛提高组 时间限制: 1 s空间限制: 128000 KB题目等级 : 黄金 Gold题目描述 Description给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入&#xff0c;且保证每行一定为20个)。要求将此字母串分成k…

翻译词典推荐

前言 今天在看一个API&#xff0c;遇到一些生词不会&#xff0c;花了些时间在选择词典上面&#xff0c;做个总结。 我的经历 先说说我使用词典的经历吧&#xff1a; 无网络条件&#xff1a;首选金山词霸&#xff0c;词霸本身1G多安装包配合将近2G的词典包&#xff0c;即便是断网…

用URLGather来管理和保存你的页面

下载链接&#xff1a;http://url-gather.software.informer.com/download/#downloading安装的过程简单&#xff0c;这里不一一叙述。安装成功后&#xff0c;找到软件安装的路径&#xff0c;如下&#xff1a;进入软件之后&#xff0c;你只要熟悉以下的功能就能轻松的管理你的网站…

Exynos4412 中断处理流程详解

Linux 中&#xff0c;当外设触发中断后&#xff0c;大体处理流程如下&#xff1a; a -- 具体CPU architecture相关的模块会进行现场保护&#xff0c;然后调用machine driver对应的中断处理handler&#xff1b; b -- machine driver对应的中断处理handler中会根据硬件的信息获取…

XPath学习笔记

XPath语法 XPath使用路径表达式选取XML文档中的节点或者节点集。 路径表达式 表达式描述nodename获得该节点下的所有节点/从根节点开始//从匹配选择的当前节点开始&#xff0c;不考虑位置.选取当前节点…选取当前节点的父节点选取属性 比如&#xff1a; 表达式描述nation选…

Exynos4412 中断驱动开发相关问题总结

1、Linux 中如何标识一个外部中断&#xff1f; 在linux kernel中&#xff0c;我们使用下面两个ID来标识一个来自外设的中断&#xff1a; a -- IRQ number CPU需要为每一个外设中断编号&#xff0c;我们称之IRQ Number。这个IRQ number是一个虚拟的interrupt ID&#xff0c;和硬…