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说明 ...
随机推荐
- C++HeartCode
#include <iostream> int main() { int A=43,B=A/2, C=B/2,x,y,i=B,j=-C;for(y=0;y<B;j=(++y)-(C+ ...
- IPv6是未来趋势?部署IPv6有什么技术障碍?
没有人在用IPv6?我相信有很多人在谈话中听到了类似的内容,虽然很难说服这些人,越来越多的组织正在部署IPv6,特别是当采用率在20岁时如此缓慢到目前为止存在的一年,这些实例至少让我有机会让他们再次思 ...
- Task6.PyTorch理解更多神经网络优化方法
1.了解不同优化器 2.书写优化器代码3.Momentum4.二维优化,随机梯度下降法进行优化实现5.Ada自适应梯度调节法6.RMSProp7.Adam8.PyTorch种优化器选择 梯度下降法: ...
- 命令——tree
tree——以树形结构显示目录文件 [root@centos71 ~]# yum provides tree Loaded plugins: fastestmirror Loading mirror ...
- ViewContainerRef 动态创建视图
Angular DOM 操作 相关的APIs和类: 查询DOM节点 template variable ref: 模版变量引用,相当于react中的ref ViewChild: 查询DOM,返回单个元 ...
- 计蒜客 T2237 魔法 分类讨论
Code: #include<bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) # ...
- (23)C++/Python项目练习一
逆转字符串——输入一个字符串,将其逆转并输出. Python: def rev(s): return (s[::-1]) s =input("请输入一个字符串:") a = rev ...
- (22)Python练习项目集
文本操作 逆转字符串——输入一个字符串,将其逆转并输出. 拉丁猪文字游戏——这是一个英语语言游戏.基本规则是将一个英语单词的第一个辅音音素的字母移动到词尾并且加上后缀-ay(譬如“banana”会变成 ...
- Python学习笔记(三)- SyntaxError: Non-ASCII character '\xe7' in file
在编辑Python时,当有中文输出或者注释时,出现错误提示:“SyntaxError: Non-ASCII character '\xe7' in file“ 原因:python的默认编码文件是用的A ...
- 【转】阿里架构总监一次讲透中台架构,13页PPT精华详解
转:https://blog.csdn.net/u011323949/article/details/99542576 本文整理了阿里几位技术专家,如架构总监 谢纯良,中间件技术专家 玄难等几位大牛, ...