zoukankan      html  css  js  c++  java
  • 对象字面量内的属性可以直接引用另一个属性么?

    js 通过对象字面量创建对象非常简单,譬如:

    var a = {
        p1: [1]
    };

    但是这种方式有另一个缺点,

    如果要在对象字面量内定义另一个属性譬如 p2 引用 p1 的话,非常不方便,

    所以通常都是在字面量外去引用,譬如:

    var a = {
        p1: [1]
    };
    a.p2 = a.p1

    当然这样降低了可读性,如果非要在对象字面量内写的话,可能要这样,不过这里 p2 实际上是访问器属性:

    var a = {
        p1: [1],
        get p2(){return this.p1},
        set p2(v){this.p1=v}
    }

    如果对 js 不太熟悉,可能会想是不是有这样的代码可行?

    var a = {
        p1: [1],
        p2: a.p1//this.p1
    };
    实际上都是不行的,因为对象字面量里 this 和 a 都是从作用域链中去寻找的,ES6之前只有两个作用域,全局或函数,在这里,没有函数,就是全局作用域,所以 this 和 a 就会从当前全局作用域中去寻找,这个可以通过下面代码验证:
    window.p1=1;
    var a = {
        p1: [1],
        p2: this.p1
    };
    a.p2// 1 ,全局作用域中,浏览器端 this 指向window,所以a.p2被 window.p1 赋值

    再考虑下面代码:

    var a={p1:111};
    var a = {
        p1: [1],
        p2: a.p1
    };
    a.p2//111

    这个稍微复杂些,在这个赋值表达式里

    1、先获得 a 的引用,此时 a 还是指向 {p1:111}
    2、计算右值,通过 var a={p1:111}; 和 a.p1 得出p2=111,p1=[1]
    3、把 a 重新指向这个对象;

    所以这里 a 也是之前的 a 无法引用自身。(关于赋值执行顺序,可以参考这篇博客,)

    如果把第一行的 a 去掉,就会报错,考虑下面代码:

    var b={p1:111};
    var a = {
        p1: [1],
        p2: a.p1// 在这里计算 a.p1值的时候,由于 var 的变量提升,这里 a 被提前声明,不过值是 undefined,所以报错:Cannot read property 'p1' of undefined
    };

    上面的代码实际相当于:

    var a,b;//赋值前值为undefined
    b={p1:111};
    a = {
        p1: [1],
        p2: a.p1//报错因为 a 是 undefined,获取 undefined 的属性会报错
    };
  • 相关阅读:
    线段树(区间合并) LA 3989 "Ray, Pass me the dishes!"
    BIT LA 4329 Ping pong
    并查集(路径更新) LA 3027 Corporative Network
    log4j.properties配置详解与实例-全部测试通过
    ActiveMQ入门实例
    activemq安全设置 设置admin的用户名和密码
    Freemarker入门小案例(生成静态网页的其中一种方式)
    maven项目在myeclipse中不出现Maven Dependencies 和maven标识的解决方法
    Mysql,SqlServer,Oracle主键自动增长的设置
    常用SQL语句
  • 原文地址:https://www.cnblogs.com/xianshenglu/p/8324631.html
Copyright © 2011-2022 走看看