JavaScript对象的特性与实践应用深入详解


Posted in Javascript onDecember 30, 2018

本文实例讲述了JavaScript对象的特性与实践应用。分享给大家供大家参考,具体如下:

JavaScript 的简单数据类型是数字、字符串、布尔值(true/false)、null 以及 undefined,其它所有的值都是对象。这些对象是可变的键值对集合。

对象是属性的容器,每个属性都有名字和值。属性的名字可以是包含空字符串在内的任何字符串,而属性值是除 undefined 值之外的任意值。

对象是无类型的,它对属性的名字和值没有类型限制。所以对象很适合汇集和管理数据。对象可以包含其他对象,所以可以很容易地表示成树状或图形数据结构。

使用原型链,可以让一个对象继承另一个对象的属性。合理地使用这一特性,可以减少初始化对象所消耗的内存和时间。

1 对象字面量

对象字面量是包围在一对花括号中的零或多个名值对,它可以出现在任何允许表达式出现的地方:

var empty_object = {};
var stooge = {
  "first-name": "deniro",
  "last-name": "Li"
};

属性的名字可以是包含空字符串在内的任何字符串。如果属性名是合法的 JavaScript 标识符,则可以不加引号。逗号用来分隔多个名值对。

属性值可以是任意的表达式(包括另一个对象字面量),即对象是可潜逃的:

var flight = {
  airline: "Oceanic",
  number: 815,
  departure: {
    IATA: "SYD",
    time: "2017-08-02 19:00",
    city: "Sydney"
  },
  arrival: {
    IATA: "LAX",
    time: "2017-08-03 21:37",
    city: "Los Angeles"
  }
};

2 检索

可以使用 [ ] 语法来获取对象的值。如果字符串表达式是一个字符串字面量,而且它又是一个合法的 JavaScript 标识符,那么也可以使用 . 语法。优先使用 . 语法,因为它更紧凑,而且可读性更好:

console.log(stooge["first-name"]);//"deniro"
console.log(flight.departure.IATA);//"SYD"(优先考虑 . 表示法)

如果要检索的属性的值不存在,会返回 undefined:

console.log(stooge["middle-name"]);
console.log(flight.status);
console.log(stooge["FIRST-NAME"]);

|| 运算符可用来填充默认值:

console.log(stooge["middle-name"] || "(none)");//(none)
console.log(flight.status || "unknown");//unknown

从 undefined 的属性中取值会抛出 TypeError 异常,我们可以使用 && 来避免这个问题:

console.log(flight.equipment);//undefined
//console.log(flight.equipment.model);//抛出 TypeError
console.log(flight.equipment && flight.equipment.model);//undefined

3 更新

可以通过赋值语句来更新对象的值。如果属性名已存在于对象中,那么属性的值就会被替换:

stooge["first-name"] = "lily";
console.log(stooge["first-name"]);//"lily"

如果对象之前没有这个属性,那么这个新属性就会被扩充到对象中:

stooge["middle-name"] = "Song";
console.log(stooge["middle-name"]);//"Song"
stooge.nickname = "Deniro";
console.log(stooge.nickname);//"Deniro"
flight.equipment = {
  model: "Boeiing 787"
};
console.log(flight.equipment.model);//"Boeiing 787"
flight.status = "overdue";
console.log(flight.status);//"overdue"

4 引用

对象是通过引用来传递的,所以它们永远不会被复制:

var x = stooge;
x.nickname = "Lucy";
console.log(stooge.nickname);//"Lucy";x 与 stooge 指向同一个引用
var a = {}, b = {}, c = {};//a、b、c 引用一个不同的空对象
a = b = c = {};//a、b、c 引用同一个空对象

5 原型

每个对象都连接到一个原型对象,然后继承原型对象的属性。所有通过对象字面量创建的对象都连接到 Object.prototype,它是标配对象。

创建一个新对象时,可以指定某个对象作为它的原型。我们为 Object 新增一个 create 方法,它会创建并返回一个使用原对象作为原型对象的新对象:

if (typeof Object.beget !== "function") {
  Object.create = function (o) {
    var F = function () {
    };
    F.prototype = o;
    return new F();
  }
}
var another_stooge = Object.create(stooge);

更新某个对象时,是不会更新原型对象的:

another_stooge["first-name"] = "Jack";
console.log(another_stooge["first-name"]);//"Jack"
console.log(stooge["first-name"]);//"lily"

只有在检索的时候,才会用到原型对象。如果没有在对象中检索到某个属性,那么 JavaScript 就会试着从原型对象中获取属性值,如果还是没有找到,JavaScript 就会沿着原型链向上回溯,直到 Object。如果都不存在,就会返回 undefined。

原型关系是动态的关系。如果我们新增一个属性到原型链中,那么这个属性就会立即对所有基于该原型所创建的对象可见:

stooge.profession = "actor";
console.log(another_stooge.profession);//"actor"

6 反射

typeof 操作符有助于确定属性的类型:

console.log(typeof flight.number);//number
console.log(typeof flight.status);//string
console.log(typeof flight.arrival);//object
console.log(typeof flight.manifest);//undefined

注意原型链中的任何属性都会产生值:

console.log(typeof flight.toString);//function
console.log(typeof flight.constructor);//function

有两种方法可以去除这些属性:
①. 检查并丢弃值为函数的属性。
②. 使用 hasOwnProperty 方法,如果对象拥有独有的属性,它就会返回 true:

console.log(flight.hasOwnProperty("number"));//true
console.log(flight.hasOwnProperty("constructor"));//false

7 枚举

for in 语句会遍历一个对象中的所有属性名,所以要过滤掉那些你不想要的属性:

var name;
for (name in another_stooge) {
  if (typeof another_stooge[name] !== 'function') {//过滤掉函数
    document.writeln(name + ': ' + another_stooge[name] + "; ");
  }
}

属性名出现的顺序是不确定的。如果要让属性以特定的顺序出现,就要创建一个包含特定属性名的数组:

var i;
var properties = [
  "first-name",
  "middle-name",
  "last-name",
  'profession'
];//定义想要的属性以及属性顺序
for (i = 0; i < properties.length; i += 1) {
  document.writeln(properties[i] + ": " + another_stooge[properties[i]] + "; ");
}

8 删除

delete 运算符会删除对象的属性,但它不会涉及原型链中的任何对象。

删除对象的属性可能会让来自原型链的属性呈现出来:

another_stooge.nickname = "Jack";
console.log(another_stooge.nickname);//Jack
delete another_stooge.nickname;
console.log(another_stooge.nickname);//Lucy

9 减少全局变量的污染

全局变量削弱了程序的灵活性,所以要避免使用。

只创建一个唯一的全局变量:

var MYAPP = {};

这个变量就变成我们应用的容器:

MYAPP.stooge = {
  "first-name": "deniro",
  "last-name": "Li"
};
MYAPP.flight = {
  airline: "Oceanic",
  number: 815,
  departure: {
    IATA: "SYD",
    time: "2017-08-02 19:00",
    city: "Sydney"
  },
  arrival: {
    IATA: "LAX",
    time: "2017-08-03 21:37",
    city: "Los Angeles"
  }
};

要把全局性的资源都纳入一个命名空间下,这样我们的程序与其他类库发生冲突的可能性会显著降低,而且程序也变得更易阅读。

感兴趣的朋友还可以使用本站在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行结果。

更多关于JavaScript相关内容还可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JavaScript 学习笔记 Black.Caffeine 09.11.28
Nov 30 Javascript
jquery实现在页面加载的时自动为日期插件添加当前日期
Aug 20 Javascript
简单三步实现报表页面集成天气
Dec 15 Javascript
原生JS实现图片翻书效果
Feb 16 Javascript
前端构建工具之gulp的配置与搭建详解
Jun 12 Javascript
JavaScript闭包_动力节点Java学院整理
Jun 27 Javascript
JavaScript面向对象精要(上部)
Sep 12 Javascript
详解layui中的树形关于取值传值问题
Jan 16 Javascript
jquery实现下载图片功能
Jul 18 jQuery
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
Dec 21 Javascript
小程序外卖订单界面的示例代码
Dec 30 Javascript
详解 javascript对象创建模式
Oct 30 Javascript
three.js搭建室内场景教程
Dec 30 #Javascript
Three.JS实现三维场景
Dec 30 #Javascript
Three.js实现简单3D房间布局
Dec 30 #Javascript
JavaScript数组特性与实践应用深入详解
Dec 30 #Javascript
微信小程序实现通过双向滑动缩放图片大小的方法
Dec 30 #Javascript
微信小程序使用setData修改数组中单个对象的方法分析
Dec 30 #Javascript
微信小程序提交form操作示例
Dec 30 #Javascript
You might like
PHP 抓取网页图片并且另存为的实现代码
2010/03/24 PHP
简单实现限定phpmyadmin访问ip的方法
2013/03/05 PHP
php+html5使用FormData对象提交表单及上传图片的方法
2015/02/11 PHP
PHP实现的曲线统计图表示例
2016/11/10 PHP
thinkPHP5.0框架API优化后的友好性分析
2017/03/17 PHP
PHP类与对象后期静态绑定操作实例详解
2018/12/20 PHP
laravel-admin的多级联动方法
2019/09/30 PHP
jQuery解析与处理服务器端返回xml格式数据的方法详解
2016/07/04 Javascript
Bootstrap简单表单显示学习笔记
2016/11/15 Javascript
jQuery插件HighCharts实现2D柱状图、折线图的组合多轴图效果示例【附demo源码下载】
2017/03/09 Javascript
webpack4 SCSS提取和懒加载的示例
2018/09/03 Javascript
WebGL学习教程之Three.js学习笔记(第一篇)
2019/04/25 Javascript
JS数组方法push()、pop()用法实例分析
2020/01/18 Javascript
JavaScript 实现自己的安卓手机自动化工具脚本(推荐)
2020/05/13 Javascript
详解Vue中Axios封装API接口的思路及方法
2020/10/10 Javascript
在Vue中使用Select选择器拼接label的操作
2020/10/22 Javascript
Vue.js桌面端自定义滚动条组件之美化滚动条VScroll
2020/12/01 Vue.js
[42:20]Winstrike vs VGJ.S 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
Python functools模块学习总结
2015/05/09 Python
Perl中著名的Schwartzian转换问题解决实现
2015/06/02 Python
python杀死一个线程的方法
2015/09/06 Python
使用Python解析JSON数据的基本方法
2015/10/15 Python
python获取外网IP并发邮件的实现方法
2017/10/01 Python
python多进程中的内存复制(实例讲解)
2018/01/05 Python
Django 自定义权限管理系统详解(通过中间件认证)
2020/03/11 Python
canvas使用注意点总结
2013/07/19 HTML / CSS
英国自行车商店:AW Cycles
2021/02/24 全球购物
区域总监的岗位职责
2013/11/21 职场文书
家长给幼儿园的表扬信
2014/01/09 职场文书
汽车销售员如何做职业生涯规划
2014/02/16 职场文书
个人培训自我鉴定
2014/03/28 职场文书
综合内勤岗位职责
2014/04/14 职场文书
2014最新自愿离婚协议书范本
2014/11/19 职场文书
超市督导岗位职责
2015/04/10 职场文书
小区环境卫生倡议书
2015/04/29 职场文书
清明扫墓感想
2015/08/11 职场文书