面向对象的 Javascript(2)
作者:mozart0 来源:蓝色经典 发布时间:2013-07-21 11:57:22
引用
JavaScript的一个重要的方面是引用的概念。引用就是指向对象实际位置的指针。这是一项极其强大的功能。前提是,实际的对象决不是一个引用:字符串总是一个字符串,数组总是一个数组。然而,多个变量可以引用相同的对象。JavaScript就是以这种引用引用机制为基础。通过维护一系列的指向其它对象的引用,语言为你提供了更大的弹性。
另外,对象能包括一系列的属性,这些属性简单地引用其它对象(如字符串,数字,数组等等)。当几个变量指向相同对象时,修改底层对象类型将会在所有的指点向它的变量上有所反映。例2-1即此一例,两个变量指向同一个对象,但是对对象内容的修改的反映是全局的。
程序2-1. 多变量引用单个对象的示例
//设置obj为一个空对象
var obj = new Object();
//objRef现在引用了别的对象
var objRef = obj;
//修改原始对象的属性
obj.oneProperty = true;
//我们可以发现该变化在两个变量中都可以看到
//(因为他们引用了同一个对象)
alert( obj.oneProperty === objRef.oneProperty );
我从前提到过自更改的对象在JavaScript里非常少见的。让我们看一个发生这一状况的实例。数组对象能够用push方法给它自己增加额外的项。因为在数组对象的核心,值是作为对象的属性存储的,结果类似程序2-1中的情形,一个对象成为全局被改动的(导致了多个变量的值被同时改变)。见程序2-2.
程序2-2. 自修改对象的例子
//创建一组项目的数组
var items = new Array( "one", "two", "three" );
//创建一个对项目数组的引用
var itemsRef = items;
//给原始数组添加一项
items.push( "four" );
//两个数组的长度应该相同,
//因为它们都指向相同的数组对象
alert( items.length == itemsRef.length );
记住这一点是很重要的:引用总是只指向最终被引用的对象,而不会是引用本身。例如,在Perl语言里,很可能有一个引用指向另一个也是引用的变量。但在JavaScript里,它会沿着引用链向下追溯直到指向核心的对象。程序2-3演示了这种情形,物理的目标已经改变而引用仍然指向原来的对象。
程序2-3. Changing the Reference of an Object While Maintaining Integrity(见#9 oerrite 的回复)
// 设置items为一个字符串的数组(对象)
var items = new Array( "one", "two", "three" );
// 设置itemsRef为对items的引用
var itemsRef = items;
//让items指向一个新的对象
items = new Array( "new", "array" );
// items和itemsRef现在指向不同的对象
// items指向new Array( "new", "array" )
// itemsRef则指向new Array( "one", "two", "three" )
alert( items !== itemsRef );
最后,让我们来看一个陌生的例子,表面似乎是一个自修改的对象,却作用于一个新的未被引用的对象。当执行字符串串联时,结果总是一个新的字符串对象,而非原字符串更改后的版本。这在程序2-4中可以看出。
程序2-4. 对象修改作用于一个新的对象而非自修改对象的示例
//让item等于一个新的字符串对象
var item = "test";
//itemRef也引用相同的字符串对象
var itemRef = item;
//在字符串对象上串联一个新的对象
//注意:这创建了一个新的对象,并不修改初始对象
item += "ing";
//item和itemRef的值并不相等,因为
//一个全新的对象被创建了
alert( item != itemRef );
如果你刚刚接触,引用可能是个令人头大的刁钻话题。然而,理解引用是如何工作的对于编写良好、干净的JavaScript代码是极其重要的。接下来的几节我们将探究几种未必新鲜和令人激动的,但是同样对编写良好、干净的代码很重要的特性。


猜你喜欢
- 01_msgbox# 使用easygui功能,可以直接导入easygui模块import easygui# 需要弹框时,要使用easygui
- 1、下载安装好PyCharm 专业版后打开或者新建一个Python项目,找到View导航栏,如下图:在Tool Windows下可以找到Sc
- 前言学前端最基本的登录页面肯定要会写,那登录页面里面的密码框的功能设计就需要好好打磨,主要功能有显示密码明文,密码检测信息提示等等,那么本篇
- pytorch forwod函数在父类中的调用问题背景最近在研究Detetron2的代码结构时,发现有些网络代码里面没有forward函数,
- 使用echarts时created里拿到的数据无法渲染问题描述在vue里使用echart时,created里请求的数据,但是却无法渲染;代码
- 1. logging日志的介绍在现实生活中,记录日志非常重要,比如:银行转账时会有转账记录;飞机飞行过程中,会有个黑盒子(飞行数据记录器)记
- 在实际应用中,我们经常需要使用定时器去触发一些事件。Python中通过线程实现定时器timer,其使用非常简单。看示例:import thr
- 在中文网页中最常见的网页编码就是GB2312和UTF-8了,本文介绍了ASP实现GB2312编码转换为UTF-8编码的函数:Function
- 1、安装requests、xlrd、json、unittest库<1>pip 命令安装:pip install requests
- 前言大家都知道Python的优点是开发效率高,使用方便,C++则是运行效率高,这两者可以相辅相成,不管是在Python项目中嵌入C++代码,
- 首先我是用pycharm完成的,要确定命令行和界面里是同一个环境。如果不确定可以设置再add在新增加的环境里看现在是哪个环境,只要选择已有的
- WebDriver有2个方法执行Java Script脚本。(1)同步执行:execute_script(2)异步执行:execute_as
- 在IDLE下清屏:#网上有些先定义函数,再?print("\n" * 100)输出一百个换行的方法有点扯淡,跟连按回车没
- 最近尝试写python GUI界面,决定先从tkinter开始。但是遇到了无法安装。执行pip install tkinter没有用,报了如
- 一、进程间通信IPC(Inter-Process Communication)IPC机制:实现进程之间通讯管道:pipe 基于共享的内存空间
- 前言Iframe 是一种将网页嵌入到另一个页面的内容中的方法。这是通过使用 HTML 元素、外部网站的 URL 以及窗口在您的网站上的外观参
- Python读取相对路径文件例如下图目录结构:第一种情况1)xxx.py想要打开a.txt,使用相对路径,有如下两种方式:思路:xxx.py
- 高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法
- 如下所示:#ltp_data 字符串 写进777.txt1、def save(filename, contents): fh = open(
- 在Web上使用菜单可以极大地节约页面的空间,同时也比较的符合用户从Windows上继承下来的UI操作体验。在以往的Web页菜单设计中,我们普