js面向对象的程序设计 --- 上篇(理解对象)
前言 ECMAScript中没有类的概念,因此它们的对象与基于类的语言中的对象有所不同。 ECMA-262把对象定义为:"无序的集合属性,其属性可以包含基本值,对象或者函数"。正因为这样,我们可以把ECMAScript想象成散列表: 无非就是一组名值对,其中值可以是数据或者函数, 每个对象都是基于一个引用类型创建的,这个引用类型可以是第5章讨论的原生类型,也可以是开发人员定义的类型 ·理解对象 ·属性类型 ECMA-262定义了只有自内部才用指定特性时,描述了属性的各种特征。ECMA-262定义这些特性是为了实现javascript引擎用的,因此在javascript 中不能直接访问它们。为了表示特性是内部值,该规范把它们放在两对儿方括号中,例如:[[Enumerable]] 1. 数据属性 数据属性包含一个数据值的位置。在这个位置可以读取和写入。数据属性有4个描述其行为的特性 ·[[CONFIGURABLE]] : 能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。 直接在对象上定义的属性,它们的这个特性默认值为true ·[[Enumerable]] : 表示能否通过 for-in 循环返回出行 。 默认 true ·[[Writable]] : 表示能否修改属性的值。 默认 true ·[[Value]] : 包含这个属性的数据值。读取属性的时候,从这个位置读;写入属性值的时候,把新值保存在这个位置。默认为undefined 2. 访问器属性 访问器属性不包含数据值;它们包含一对getter 和 setter 函数 (不过,这两个函数都不是必需的)。 ·[[CONFIGURABLE]] : 能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。 直接在对象上定义的属性,它们的这个特性默认值为true ·[[Enumerable]] : 表示能否通过 for-in 循环返回出行 。 默认 true ·[[Get]] : 在读取属性时调用的函数。默认值为undefined ·[[Set]] : 在写入属性时调用的函数。默认值为undefined ·心得:ECMAScript中并没有直接定义一个属性是数据属性还是访问器属性。 根据个人心得: 如果直接指定了get 特性或者 set 特性,那么就是访问器属性。如果指定了任何数据属性特性中的一个,那么就是数据属性。 如果没有把 CONFIGURABLE 设为false ,那么数据属性和访问器属性可以互相转换
<script> var person = {name : "Leo"};// 定义访问器属性 Object.defineProperty(person,"style",{configurable : false,get : function () {return "style:"+this.name;},set : function (value) {this.name = value;}}); console.log(person.style); // 触发访问器属性的get方法 // 输出style:Leo person.style = 'mystyle'; // 触发访问器属性的set方法 // 输出style:mystyle console.log(person.style);// 修改为数据属性 Object.defineProperty(person,"style",{value : '' // 访问器属性以及定义了 configurable : false ,即表示不能把属性定义为数据属性,还强行定义,自然就报错了 });</script>
<!doctype html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title> </head> <body> <script>// 由于对象定义多个属性的可能性非常大。ECMAScript5又定义了一个Object.defineProperties() 方法。// 这次,我们把数据属性和访问器属性放在一个方法里面var book = {};Object.defineProperties(book,{__year : {writable : true ,value : 2004,},edition : {writable : true,value : 1,},year : {get : function () {return this.__year;},set : function (newValue) {if(newValue > 2004){this._year = newValue;this.edition += newValue - 2004;}}}})// 使用ECMAScript5的Object.getOwnPropertyDescriptor() 方法,可以取得给定属性的描述符var descriptor = Object.getOwnPropertyDescriptor(book,'__year');console.log(descriptor); //{value: 2004, writable: true, enumerable: false, configurable: false}console.log(Object.getOwnPropertyDescriptor(window,'year')); //{get: ƒ, set: ƒ, enumerable: false, configurable: false}// 记住: 在ECMAScript中,可以针对任何对象使用Object.getOwnPropertyDescriptor() 方法,包括DOM对象和BOM对象 </script> </body> </html>
转载于:https://www.cnblogs.com/cl94/p/11257661.html
js面向对象的程序设计 --- 上篇(理解对象)相关推荐
- 面向对象的程序设计1 理解对象—— JS学习笔记2015-7-4(第75天)
面向对象的程序设计一-- 理解对象 转载于:https://www.cnblogs.com/zhangxg/p/4621520.html
- Js面向对象的程序设计——理解对象
Js面向对象的程序设计 Js面向对象的程序设计 理解对象 属性类型 Js面向对象的程序设计 理解对象 示例 : var person=new Object(); person.name="N ...
- JS面向对象的程序设计之继承-继承的实现-借用构造函数
JS面向对象的程序设计之继承-继承的实现-借用构造函数 前言:最近在细读Javascript高级程序设计,对于我而言,中文版,书中很多地方翻译的差强人意,所以用自己所理解的,尝试解读下.如有纰漏或错误 ...
- JS面向对象的程序设计
面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装.继承.多态的特性!但JS中 对象与纯面向对象语言中的对象是不同的,ECMA标准定义 ...
- webatm取款操作_大话JS面向对象之开篇万物皆对象------(ATM取款机引发的深思)...
一,总体概要 OO(面向对象)概念的提出是软件开发工程发展的一次革命,多年来我们借助它使得很多大型应用程序得以顺利实现.如果您还没有掌握并使用OO进行程序设计和开发,那么您无疑还停留在软件开发的石器时 ...
- JS面向对象的程序设计之创建对象_工厂模式,构造函数模式,原型模式-1
前言:最近在细读Javascript高级程序设计,对于我而言,中文版,书中很多地方翻译的差强人意,所以用自己所理解的,尝试解读下.如有纰漏或错误,会非常感谢您的指出.文中绝大部分内容引用自<Ja ...
- js面向对象的程序设计 --- 下篇 继承启蒙
继承是oo语言中一个最为人津津乐道的概念.ECMAScript支持实现继承,而且实现继承只要是靠原型链来实现的 ·原型链 其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法. 简单回顾一 ...
- js面向对象的程序设计 --- 中篇(创建对象) 之 原型模式
·原型模式 我们创建的每一个函数都由一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有 实例共享的属性和方法. 如果按照字面意思来理解,那 ...
- js面向对象的程序设计 --- 中篇(创建对象) 之 工厂模式和 构造函数模式
创建对象 虽然Object构造函数或对象字面量都可以用来创建单个对象,但这些方式有个明显的缺点:使用同一个接口创建很多对象,会产生大量重复代码. ·工厂模式 工厂模式是一种广为人知的设计模式,这种模式 ...
最新文章
- 几种和边框相关的CSS样式修改
- 试用JAVA的免费空间JHOST
- JVM 常用的基本配置有哪些?
- Jmeter脚本录制(Web)
- IntelliJ IDEA中新建JAVA WEB项目、maven项目
- Visual C#设计多功能关机程序
- Java基础学习总结(77)——Java枚举再总结
- c# 通用类扩展方法 备注
- linux怎么卸载fishshell,为Bash/Zsh/Fish安装Starship Shell提示符的步骤
- Java基础入门及安装准备
- 中国人误传千年的七句话
- iOS 模拟器安装APP,在电脑上运行ios的app
- 【PS/AI】2021新年金色装饰背景矢量素材
- Js 方法函数记录笔记
- 用Python+Moviepy+OpenCV制作灯光秀短视频
- 探秘野三坡红叶大峡谷
- 2021谷歌员工工资
- Python Pygame|实现GIF(gif)动图的加载和降帧【源码+解析】
- JavaScript中的连字符
- ubuntu下使用ppa下载
热门文章
- 用计算机编码原理解释,编码原理
- d3h 技嘉b365m 黑苹果_黑苹果硬件选购指南主板amp;硬盘amp;WI
- ElasticFusion: Real-Time Dense SLAM and Light Source Estimation
- 透明色的rgb值是多少_一文掌握PPT主题色原理及使用技巧
- 使用Keras打造一个实时可用交通标志识别App
- 大规模中文自然语言处理语料(百科,问答、新闻,翻译)
- 把Faster-RCNN的原理和实现阐述得非常清楚
- linux6.5防火墙开端口,Linux(CentOS6.5) 开放端口,配置防火墙
- plsql 存储过程 批量提交_新一代的键值存储 KVell SOSP 2019
- 美团 -python