前言
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>

js面向对象的程序设计 --- 上篇(理解对象)的更多相关文章

  1. JS面向对象的程序设计之理解对象

    一.对象定义 (1)ECMAScript中没有类的概念,因此它的对象也与基于类的语言中的对象有所不同: (2)ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值.对象或者函数” 二. ...

  2. JavaScript--我发现,原来你是这样的JS:面向对象编程OOP[1]--(理解对象和对象属性类型)

    一.介绍 老铁们,这次是JS的面向对象的编程OOP(虽然我没有对象,心累啊,但是可以自己创建啊,哈哈). JS高程里第六章的内容,这章内容在我看来是JS中很难理解的一部分.所以分成三篇博客来逐个理清. ...

  3. JS--我发现,原来你是这样的JS:面向对象编程OOP[1]--(理解对象和对象属性类型)

    一.介绍 老铁们,这次是JS的面向对象的编程OOP(虽然我没有对象,心累啊,但是可以自己创建啊,哈哈). JS高程里第六章的内容,这章内容在我看来是JS中很难理解的一部分.所以分成三篇博客来逐个理清. ...

  4. javascript 面向对象程序设计--深刻理解对象

    javascript中,每个对象都是基于一个引用类型创建的,我们可以把ECMAScript 的对象想象成散列表:无非就是一组名值对,其中值可以是数据或函数. 深刻理解对象 创建自定义对象的最简单方式就 ...

  5. JS面向对象的程序设计

    面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装.继承.多态的特性!但JS中对象与纯面向对象语言中的对象是不同的,ECMA标准定义J ...

  6. 《JavaScript高级程序设计》第六章【面向对象的程序设计】 包括对象、创建对象、继承

    一.理解对象 二.创建对象      1. 工厂模式      2. 构造函数模式      3. 原型模式      4. 组合使用构造函数模式和原型模式[使用最广泛]      5. 动态原型模式 ...

  7. js的面向对象的程序设计之理解继承

    来自<javascript高级程序设计 第三版:作者Nicholas C. Zakas>的学习笔记(六) 先来解析下标题——对象和继承~ 一.对象篇 ECMA-262把对象的定义为:&qu ...

  8. 大话JS面向对象之开篇万物皆对象------(ATM取款机引发的深思)

    一,总体概要 OO(面向对象)概念的提出是软件开发工程发展的一次革命,多年来我们借助它使得很多大型应用程序得以顺利实现.如果您还没有掌握并使用OO进行程序设计和开发,那么您无疑还停留在软件开发的石器时 ...

  9. js面向对象的程序设计 --- 下篇 继承启蒙

    继承是oo语言中一个最为人津津乐道的概念.ECMAScript支持实现继承,而且实现继承只要是靠原型链来实现的 ·原型链 其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法. 简单回顾一 ...

随机推荐

  1. Uva1213(线性筛模板+dp)

    题意: 把n拆成k个不同素数的和,有多少种拆法. 解法: 打表后dp即可,这个dp的问题可以归纳为:在n个数中选k个数,使得和m的方案数 #include<cstdio> #include ...

  2. java静态初始化块的执行顺序

    先来观察下面的代码 package trr; class Root { static{ System.out.println("Root的静态初始化块"); } { System. ...

  3. P2048 [NOI2010]超级钢琴 [堆+st表]

    考虑只能取长度为 [L,R] 的,然后不难想到用堆搞. 搞个前缀和的st表,里面维护的是一个 最大值的位置 struct rmq { int mx[N][20] ; void qwq(int n) { ...

  4. [HNOI2015]接水果[整体二分]

    [HNOI2015]接水果 给出一个树上路径集合\(S\) 多次询问\(x,y\)中的\(k\)小值 如果你问我数列上那么我会 树上的话 树上差分了吧直接?- 令 \(st_x<st_y\) 1 ...

  5. web服务器的解析漏洞罗列

    前言 服务器相关中间件存在一些解析漏洞,攻击者可通过上传一定格式的文件,被服务器的中间件进行了解析,这样就对系统造成一定危害.常见的服务器解析漏洞涉及的中间件有IIS,apache.nginx等.可利 ...

  6. 自主开发编程语言被指Python套壳,中科院开发者道歉

    中科院计算所团队“完全自主设计.开发和实现”的“木兰”编程语言是Python语言的套壳产品?针对近日这一网络质疑,1月17日,项目负责人.中科院计算所编译实验室员工刘雷在科学网上发表回应称,木兰语言在 ...

  7. Net项目添加 WebAPI

    1.新建一个  WebApiConfig.cs public static void Register(HttpConfiguration config) { // Web API 配置和服务 // ...

  8. 阿里云oss 直传

    sts获取 参考https://help.aliyun.com/document_detail/28792.html?spm=a2c4g.11186623.6.786.6fb238dfI9iiqA 配 ...

  9. openWRT和LuCI

    openwrt是一套集成在板子上的系统,通过ip进入到其页面上 Luci是lua和UCI统一配置接口的合体,实现路由的网页配置界面(相当于一个前端框架)

  10. 多线程启动selenium,报NameError: name '__file__' is not defined

    将__file__加上单引号就解决了:   # 获取当前文件名,用于创建模型及结果文件的目录   file_name = os.path.basename('__file__').split('.') ...