《高程第六章---面向对象程序设计》小结---理解对象

《JavaScript高级程序设计》这本书比较厚,之前刚学JS的时候挑战过一次,结果止步第三章。现在工作了一段时间想想还是得回过头来补充一下基础知识的。目前刚看完第六章,就从第六章开始总结吧,再逐步补充之前的好了。

理解对象

该章节讲解了JS中对象的属性类型以及对象属性间的一些设置。

JS中的对象是什么

  • JS中的对象只是一堆属性和值的无序集合,值的类型包括基本类型,函数,或者对象。
  • 属性和值之间的关系是映射关系,遵循key: value的规范。

如何创建对象

JS中创建对象的方法非常简单,有两种:

  • 使用Object构造函数
let a = new Object()
a.name = 'oxc'
console.log(a) // {name: "oxc"}

当然,你也可以在Object构造函数中传入一个参数,然后创建出来的对象是原始数据类型对象。

let a = new Object(1) // Number {[[PrimitiveValue]]: 1}
console.log(a) // 1
typeof a // 'object'
  • 使用对象字面量创建对象
let a = {
    name: 'oxc'
}
console.log(a) // {name: "oxc"}

对象的属性类型

该章节介绍了JS对象属性的类型及其特点,其中属性类型分为了数据属性访问器属性两种,同时介绍了定义属性特征值的api: defineProperty()defineProperties,以及读取对象属性特征值的api: getOwnerPropertyDescriptor()

  • 对象属性的特征值
    • 介绍:
      对象属性的特征值是对象的属性的一些特性,可以在定义该属性的时候进行设置,但是在JS中是不能直接对其进行访问的。
    • 分类
      • configurable: 表示该属性是否能够被关键词delete删除并进行重新定义,以及该属性的特性和属性类型能否被修改;
      • enumerable: 设置该属性能否被for-in循环遍历到;
      • writable: 设置该属性的值能否被修改;
      • value: 设置该属性的值;
      • get: 访问该属性的时候执行的函数;
      • set: 对该属性的值进行设置的时候执行的函数;
  • 关于Object.definePropertyObject.defineProperties
    这两个api的作用就是用来设置上面的对象属性特征值的
    • Object.defineProperty
      该api用于设置单个对象属性的特征值,接受三个参数,顺序是需要设置属性特征值的对象,需要设置的属性,然后是特征值,使用示例如下
        let a = {}
        Object.defineProperty(a, 'name', {
            configurable: true,
            enumerable: true,
            writable: true,
            value: 'oxc'
        })
        console.log(a)  //  {name: 'oxc'}
  • Object.defineProperties
    该api和defineProperty作用一致,但是可以批量设置对象属性特征值,示例如下:
        let a = {}
        Object.defineProperties(a, {
            name: {
                value: 'oxc',
                writable: false
            },
            age: {
                value: 12,
                writable: false
            }
        })
        console.log(a)  // {name: "oxc", age: 12}
  • 对象的属性类型(数据属性和访问器属性)
    • 数据属性
      • 介绍: 对象的数据属性只标明数据值的位置,在该位置可以对值进行访问和写入。
      • 数据属性包含的特征值有:configurable, enumerable, writable, value
      • 如何定义一个数据属性:
        let a = {}
        Object.defineProperty(a, 'name', {
            configurable: false,
            enumerable: false,
            writable: false,
            value: 'oxc'
        })
        console.log(a)  //  {name: 'oxc'}
        // 该例子创建了一个名为name的属性,该属性可以被delete删除,for-in循环无法遍历它,也无法对其值进行修改,他的值为`oxc`,并且也不可以在下面对其属性特征值进行重写,重写特征值不会有任何反应。
       // 该属性就是数据属性,值得一提的是,用对象字面量或者对象构造函数新建的对象属性`configurable`,`writable`,`enumerable`三个值默认都为true
  • 访问器属性
    • 介绍: 访问器属性是指通过这个属性去对象的属性;
    • 访问器属性包含的特征值有:configrable,enumerable,get,set;
    • 定义一个访问器属性
        let a = {
            _name: 'oxc'
        }
        Object.defineProperty(a, 'name', {
            configurable: false,
            enumerable: true,
            get() {
                return this._name
            },
            set(value) {
                this._name = value
            }
        })
    //  这时候我们可以通过调用a.name来对_name属性进行访问和写入,并且可以在访问和写入的过程中通过get和set做一些手脚,例如我想通过name读取到的是123,可以在get函数中这么写
    get(){ return 123 }
    console.log(a.name)   // 123
// 又或者我想别人无论怎么设置a.name, a._name都是123,就可以在set函数中这么写
    set(value){ this._name = 123 }
// 另外值得一提的是,如果enumerable设置为true, 那么访问器属性name也是可以可以被for-in循环遍历到的
  • 访问器属性的用途
    访问器属性除了上面所说的功能,在实际中的用途也是很广的,其中用得最多的一条就是用getset函数通过计算对目标对象的其它属性进行修改,如下例子:
        let a = {
            _name: 'oxc',
            age: 10
        }
        Object.defineProperty(a, 'name', {
            configurable: false,
            enumerable: true,
            get() {
                return this._name
            },
            set(value) {
                value === '大春春' ? this.age = 80 : this.age = 10
            }
        })
        a.name = '大春春'
        console.log(a)      //  {_name: "oxc", age: 80}
  • 值得一提的是,当前Vue的响应式系统的原理就是利用Object.defineProperty进行设置的,关于这点可以查看我的这篇博客关于Vue的MVVM

  • 关于属性特征默认值

    • 如果使用普通的对象创建方法创建的对象,就是不使用Object.definePropertyObject.defineProperties创建的属性,那么默认是数据属性,并且configurable,enumerable,'writable'都是true
    • 但是如果使用的是Object.definePropertyObject.defineProperties创建的数据属性,那么configurable,enumerable,'writable'都是false访问器属性一样默认configurableenumerable都为false
// 普通创建的对象属性特征值
        let a = {
            name: 'oxc'
        }
        let b = Object.getOwnPropertyDescriptor(a, 'name')
        console.log(b) // {value: "oxc", writable: true, enumerable: true, configurable: true}
// 使用Object.defineProperty创建的属性
        let a = {}
        Object.defineProperty(a, 'name', {
            value: 'oxc'
        })
        let b = Object.getOwnPropertyDescriptor(a, 'name')
        console.log(b) // {value: "oxc", writable: false, enumerable: false, configurable: false}

读取属性的特性

读取属性的特征值可以用Object.getOwnPropertyDescriptor, 该方法接受两个参数,第一个参数是需要读取的属性所在的对象,第二个是需要读取的属性,例子如上默认值例子。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容