• 面向对象的 Javascript 语言特性:引用


    引用

      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代码是极其重要的。接下来的几节我们将探究几种未必新鲜和令人激动的,但是同样对编写良好、干净的代码很重要的特性。

  • 相关阅读:
    react 组件传值
    vue 子组件如何修改父组件data中的值??????????????????
    移动端的一些初始化 css 样式。。。
    centos7命令
    poi导出
    eclipse项目导入工作空间提示已存在问题
    maven jar包冲突问题
    layui下拉框渲染问题,以及回显问题
    两个线程交替运行——使用synchronized+wait+notify实现
    造成索引失效的情况
  • 原文地址:https://www.cnblogs.com/zitiger/p/776750.html
Copyright © 2020-2023  润新知