JavaScript高级程序设计(第3版) 笔记

第六章 面向对象的程序设计

6.1 理解对象

6.1.1 属性类型

  • ECMAScript 中有两种属性: 数据属性和访问器属性
  • 数据属性:
    • [[Configurable]] : 表示能否通过delete删除属性从而重新定义属性
    • [[Enumerable]] : 表示能否通过for-in循环返回属性
    • [[Writable]] : 表示能否修改属性的值。
    • [[value]] : 表示这个属性的数据值。
        var person = {
            name: "Jay",
        }
        console.log(person.name); // Jay
        person.name = "Lucy";
        console.log(person.name); // Lucy

默认可以修改,可以使用Object.defineProperty()方法。接受三个参数:a:属性所在的对象、b:属性的名字、c: 一个描述符对象。,描述符对象的属性必须是:configurable、enumerable、writable、value。

        var person = {}
        Object.defineProperty(person, "name", {
            writable:false,
            value: "Jay"
        })
        console.log(person.name); // Jay
        person.name = "Lucy";
        console.log(person.name); // Jay

在调用Object.defineProperty()方法创建一个新的属性时,如果不指定,configurable、enumerable和writable 特性的默认值都是false

  • 访问器属性
    访问器属性不包括数据值;有getter和setter函数。在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值;在写入访问器属性时,会调用setter函数并传入新值,这个函数负责决定如歌处理数据。
  • [[ Configurable ]] : 表示能否通过delete删除属性从而重新定义。
  • [[ Enumerable ]] : 表示能否通过for-in 循环返回属性。
  • [[ Get ]] :在读取属性时调用的函数,默认值:undefined。
  • [[ Set ]] : 在写入属性时调用的函数,默认值:underfined。
    访问器属性不能直接定义,必须使用Object.defineProperty()来定义。
        var person = {
            _name: "Jay",
            age: "18"
        };
        Object.defineProperty(person,"name",{
            get: function(){
                return this._name;
            },
            set: function(newName){
                if(this._name !== newName){
                    this._name = newName;
                    this.age+= newName
                }
            }
        });
        person.name = "Lucy";
        console.log(person.age); // 18Lucy

6.1.2 定义多个属性
  • Object.defineProperties()方法。利用这个方法可以通过描述符一次定义多个属性。接受两个参数:a:要添加和修改其属性的对象,b: 对象的属性与第一个对象中要添加或修改的属性一一对应。
        var book = {};
        Object.defineProperties(book, {
            _year: {
                writable: true,
                value: 2000
            },
            edition: {
                writable: true,
                value: 1
            },
            year: {
                get: function() {
                    return this._year;
                },
                set: function(newValue) {
                    if(newValue > 2000) {
                        this._year = newValue;
                        this.edition += newValue - 2000;
                    }
                }
            },
        })
        book.year = 2018;
        console.log(book.edition); // 19
6.1.3 读取属性的特性
  • Object.getOwnPropertyDescriptor() 方法,可以取得给定属性的描述符。接收两个参数: a: 属性所在的对象; b: 要读取其描述符的属性名称。返回值是一个对象,如果是访问器属性,这个对象的属性有:configurable、enumerable、get、set。 如果是数据属性,这个对象的属性有: configurable、enumerable、writable、value。
        var book = {};
        Object.defineProperties(book, {
            _year: {
                writable: true,
                value: 2000
            },
            edition: {
                writable: true,
                value: 1
            },
            year: {
                get: function() {
                    return this._year;
                },
                set: function(newValue) {
                    if(newValue > 2000) {
                        this._year = newValue;
                        this.edition += newValue - 2000;
                    }
                }
            },
        })
        var descriptor = Object.getOwnPropertyDescriptor(book, "_year");
        console.log(descriptor.value); // 2000
        console.log(descriptor.configurable); // false
        console.log(typeof descriptor.get); // undefined
        var descriptor = Object.getOwnPropertyDescriptor(book,"year");
        console.log(descriptor.value); // undefined
        console.log(descriptor.enumerable); // false
        console.log(typeof descriptor.get); // function

6.2 创建对象

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

推荐阅读更多精彩内容