JS对象

作者: 林饕 | 来源:发表于2019-12-15 15:38 被阅读0次

    真是头都看秃了才能把作业做完。JS对象这一部分的初步学习遇到了一些难点。其主要的问题集中在this是什么。这里对该部分写一个简单的记录,理一理思路吧。

    本文参考了很多别人的文章,不喜欢当搬运工,基础知识已经有很多非常棒的博客了。

    REF:

    1. https://developer.mozilla.org/zh-CN/docs/Learn/JavaScript/Objects/Basics
    2. http://www.codexiu.cn/javascript/blog/40328/
    3. https://juejin.im/post/59bfe84351882531b730bac2

    对象基础

    对象是一个包含相关数据和方法的集合(通常由一些变量和函数组成,我们称之为对象里面的属性和方法)

    一个对象由许多的成员组成,每一个成员都拥有一个名字和一个值。每一个名字/值(name/value)对被逗号分隔开,并且名字和值之间由冒号(:)分隔

    var objectName = {
      member1Name : member1Value,
      member2Name : member2Value,
      member3Name : member3Value
    }
    

    创建对象的两种方法

    1. 对象字面量 使用key/value的形式直接创建对象 var obj = {key: value};

    这种方式直接通过花括号将对象的属性包起来,使用key/value的方式创建对象属性,每个属性之间用逗号隔开。

    注意:如果是最后一个属性,后面就不要加逗号,因为在一些旧的浏览器下会报错。

    1. 构造函数(new关键字)

    var o = new Object(); // 创建一个空对象,效果等同{}.

    var d = new Date(); // 创建一个表示当前时间的对象

    var r = new RegExp("js"); // 创建一个正则表达式对象

    点表示法(dot notation)

    对象的名字表现为一个命名空间(namespace),当你想访问对象内部的属性或方法时,它必须写在第一位,然后是一个点(.),紧接着是你想要访问的项目,标识可以是简单属性的名字(name),或者是数组属性的一个子元素,又或者是对象的方法调用。

    当一个对象成员的值为另一个对象的时候,子对象的命名空间则为子命名空间。链式的点表示法可以达到访问子命名空间的效果。

    括号表示法(bracket notation)

    对象有时被称之为关联数组(associative array)——对象做了字符串到值的映射,而数组做的是数字到值的映射。

    括号表示法一个有用的地方是它不仅可以动态的去设置对象成员的值,还可以动态的去设置成员的名字。

    obj[variableName] = value;
    

    重点:this

    • 像我一样的Newbie对this的理解很艰辛,我引用最后我理解的博文的两句话来总结一下:

      this永远指向最后调用它的那个对象,或者说点前面那个对象。

    比如a.func()那么functhis就是a; a.b.c.d.f.e.func()this就是e;

    匿名函数的this永远指向window,或者说你找不到谁点了这个函数,那么this代表的对象就是全局window

    • 严格模式没有window

    前面没有调用的对象那么就是全局对象 window,这就相当于是 window.a();注意,这里我们没有使用严格模式,如果使用严格模式的话,全局对象就是 undefined,那么就会报错 Uncaught TypeError: Cannot read property 'name' of undefined

    • 不会向上寻找

    就算 a 中没有 name 这个属性,也不会继续向上一个对象寻找 this.name,而是直接输出 undefined

    • 还有一个需要注意的就是,原始的对象以字典结构保存,每一个属性名都对应一个属性描述对象。例如 {foo: 5}
    {
      foo: {
        [[value]]: 5
        [[writable]]: true
        [[enumerable]]: true
        [[configurable]]: true
      }
    }
    

    如果对象成员值为函数,例如{foo: func(){}}那么其原始的对象其实是链接的函数地址。

    {
      foo: {
        [[value]]: 函数地址
        ...
      }
    }
    

    所以如果有将这个成员函数赋值给外部参数,其实相当与脱离了其对象的上下文环境直接从变量名指向了函数地址。

    其他的别的博客写得很棒了,直接去看链接吧。

    相关文章

      网友评论

          本文标题:JS对象

          本文链接:https://www.haomeiwen.com/subject/anaknctx.html