Javascript之谈对象
谈谈如何理解对象
使用预定义对象只是面向对象语言的能力的一部分,
ECMAScript真正强大之处在于能够创建自己专用的类和对象。面向对象的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象。由于ECMAScript中没有类的概念,因此它的对象也与基于类的语言中的对象有所不同。ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值、对象或者函数。”严格来讲,这就相当于说对象是一组没有特定顺序的值。对象的每个属性或方法都有一个名字,而每个名字都映射到一个值。正因为这样(以及其他将要讨论的原因),我们可以把ECMAScript的对象想象成散列表:无非就是一组名值对,其中值可以是数据或函数。每个对象都是基于一个引用类型创建的,这个引用类型可以是原生类型,也可以是开发人员定义的类型。
创建自定义对象的最简单方式就是创建一个 Object 的实例,然后再为它添加属性和方法:
let car = new Object();
car.wheel = 4;
car.run = function() {
console.log(this.wheel + ' wheels is running!');
}
属性类型
ECMA-262第 5 版在定义只有内部才用的特性时,描述了属性的各种特征。ECMA-262定义这些特性是为了实现JavaScript引擎用的,因此在JavaScript中不能直接访问它们。为了表示特性是内部值,该规范把它们放在了两对儿方括号中,例如[[Enumerable]]。
ECMAScript 中有两种属性:数据属性 和 访问器属性。
** 数据属性 **
数据属性包含一个数据值的位置, 在这个位置可以读取值也能写入, 它有4个特性:
[[Configurable]]: 表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性[[Enumerable]]: 表示能否通过for-in循环返回属性[[Writable]]: 表示能否修改属性的[[Value]]: 包含这个属性的数据值, 读属性值的时候从这里读, 写入的时候把新值保存在这, 默认值是undefined
像上面那样直接创建的属性, 包括字面量形式创建的, 除了 [[Value]] 的值被设置成指定的值, 其他的默认值都是 true, 如果要修改属性默认的特性, 需要调用 Object.defineProperty() 方法, 该方法接受3个参数, 属性所在的对象, 属性名, 描述对象, Demo 如下:
let car = {brand: 'Ferrari'};
Object.defineProperty(car, 'brand', {
writable: false
});
car.brand = 'BMW'; // 严格模式这样赋值会报错, 非严格模式下会忽略该赋值
console.log(car.brand); // Ferrari
configurable 也遵循上面的规则, 一旦把属性定义为不可配置就再也不能把它变回可配的了, Object.defineProperty() 只能修改属性的 writable 特性, 其他的修改都会导致错误, 在调用 Object.defineProperty() 时, 如果明确指定 configurable, writable, value, enumerable, 他们的默认值都是 false
** 访问器属性 **
访问器属性不包含数据值, 它包含 getter 和 setter 函数, 这两个函数也不是必须的, 在读取访问器属性时会调用 getter, 写入时调用 setter, 访问器属性有4个特性:
[[Configurable]]: 表示是否能通过dlelete删除属性, 能否修改属性的特性, 能否把属性修改为数据属性, 直接在对象上定义的属性这个特性默认是true[[Enumerable]]: 表示能否通过for-in循环返回属性, 直接定义在对象上的属性这个特性默认是true[[Get]]: 读取属性是调用的函数, 默认是undefined[[Set]]: 写入属性时调用的函数, 默认是undefined
访问器属性不能直接定义, 必须使用 Object.defineProperty() 定义, Demo 如下:
let car = {
_speed: 20,
level: 1
};
Object.defineProperty(car, 'speed', {
get: function() {
return this._speed;
},
set: function(value) {
if(value > 500 || value < 0) {
return console.log('您的车子速度异常');
}
this._speed = value;
this.level = Math.round((value - 20) / 50);
}
});
car.speed = 200;
console.log(car.level); // 4
** 定义多个属性**
为对象定义多个属性可以调用 Object.defineProperties() 方法, 与 Object.defineProperty() 方法不同, 该方法接受2个参数: 要定义属性的对象, 要添加的属性描述集合, Demo 如下:
let car = {};
Object.defineProperties(car, {
_speed: {
value: 20,
configurable: true,
writable: true
},
level: {
value: 1,
configurable: true,
writable: true
},
speed: {
get: function() {
return this._speed;
},
set: function(value) {
if(value > 500 || value < 0) {
return console.log('您的车子速度异常');
}
this._speed = value;
this.level = Math.round((value - 20) / 50);
}
}
});
小结
- 对象的属性分为两种:
数据属性和访问器属性(函数类型的我们称之为对象的方法) - 介绍了
Object.defineProperty()和Object.defineProperties()的使用, 前者接受3个参数, 后者接受2个 - 介绍了访问器属性的使用, 设置一个属性的值会导致其他属性联动的时候我们可以使用访问器属性
Javascript之谈对象的更多相关文章
- 关于JavaScript对象,你所不知道的事(一)- 先谈对象
这篇博文的主要目的是为了填坑,很久之前我发表了一篇名为关于JavaScript对象中的一切(一) - 对象属性的文章,想要谈一谈JavaScript对象,可那时只是贴了一张关于这个主题的思维导图,今天 ...
- javascript是判断对象是否是数组
JS中的数据类型: 2大类 原始类型:值保存在变量本地的数据类型 5种:Number String Boolean undefined null Number:8bytes 舍入误差-->四舍五 ...
- JavaScript 基础回顾——对象
JavaScript是基于对象的解释性语言,全部数据都是对象.在 JavaScript 中并没有 class 的概念,但是可以通过对象和类的模拟来实现面向对象编程. 1.对象 在JavaScript中 ...
- javascript中的对象,原型,原型链和面向对象
一.javascript中的属性.方法 1.首先,关于javascript中的函数/“方法”,说明两点: 1)如果访问的对象属性是一个函数,有些开发者容易认为该函数属于这个对象,因此把“属性访问”叫做 ...
- Javascript 中判断对象为空
发现了一个巧妙的实现: 需要检查一个对象(Object)是否为空,即不包含任何元素.Javascript 中的对象就是一个字典,其中包含了一系列的键值对(Key Value Pair).检查一个对象是 ...
- JavaScript 中的对象
JavaScript 中的对象 在 JavaScript 中,对象是数据(变量),拥有属性和方法. JavaScript 中的所有事物都是对象:字符串.数字.数组.日期,等等. 访问对象的属性 访 ...
- 使用JavaScript的history对象来实现页面前进后退(go/back/forward)。
我们都知道JavaScript有history对象,主要是用来记录浏览器窗口的浏览记录.但是,JS脚本是不允许访问到这个记录里面的内容(隐私). 常见的用法是: history.back();//返回 ...
- javascript类型系统——Math对象
× 目录 [1]常量 [2]函数 前面的话 javascript使用算术运算符实现基本的算术运算,如果要实现更加复杂的算术运算,需要通过Math对象定义的常量和函数来实现.和其他对象不同,Math只是 ...
- javascript中Date对象的应用——简易日历的实现
× 目录 [1]效果 [2]HTML [3]CSS[4]JS 前面的话 简易日历作为javascript中Date对象的常见应用,用途较广泛.本文将详细说明简易日历的实现思路 效果演示 HTML说明 ...
随机推荐
- 安装php-solr扩展
本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群: 281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29Lo ...
- Linux安装php扩展memcache
Linux安装php扩展memcache php扩展memcache的作用是为了支持memcached数据库缓存服务器,下面是安装方法.1.下载并解压memcache文件 wget -c http ...
- MAN RPM
RPM(8) Red Hat Linux RPM(8) NAME/名称 rpm - RPM Package Manager/RPM-RPM包管理器SYNOPSIS/简介 QUER ...
- 理解URL以及如何区分相对URL和绝对URL
URL(Uniform Resource Locator 统一资源定位符)可以理解为网络地址. url 包含了关于文件储存位置和浏览器应该如何处理文件的信息. URL的第一个部分称为模式scheme, ...
- Es6 之 const关键字
https://blog.csdn.net/jin_doudouer/article/details/80493649 es6中新增了一个const.就是用来定义一个常量的.以前其实一直没有把这个放在 ...
- oracle 11g 卸载 安装10g 成功(卸载oracle+清除注册表信息+清除oracle app文件)
停用oracle服务:进入计算机管理,在服务中,找到oracle开头的所有服务,右击选择停止 2 在开始菜单中,找到Universal Installer,运行Oracle Universal Ins ...
- 接口返回buffer的16进制数据如何转换
我们请求接口数据经常会看到buffer数据,这是我们可以使用data.toString()就可以啦~
- CSS中的自适应单位vw、vh、vmin、vmax
1.vw.vh.vmin.vmax各单位的意义 上面的自适应单位可以统称为视口单位. 可以先了解一下视口指的是什么? 在PC端,视口指的是在PC端,指的是浏览器的可视区域:而在移动端,它涉及3个视口: ...
- [luogu]P3939 数颜色[二分]
[luogu]P3939 数颜色 题目描述 小 C 的兔子不是雪白的,而是五彩缤纷的.每只兔子都有一种颜色,不同的兔子可能有 相同的颜色.小 C 把她标号从 1 到 n 的 n 只兔子排成长长的一排, ...
- 【gym102222K】Vertex Covers(高维前缀和,meet in the middle)
题意:给定一张n点m边的图,点带点权,定义点覆盖的权值为点权之积,问所有点覆盖的权值之和膜q n<=36, 1<=a[i]<=1e9,1e8<=q<=1e9 思路:n&l ...