美文网首页
JavaScript高级程序设计(第3版) 笔记

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

作者: Jay_Chen | 来源:发表于2018-07-03 18:25 被阅读11次

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

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 创建对象

相关文章

  • TypeScript学习记录- 数据类型基础

    TS 学习笔记记录 相关文档 TypeScript 入门教程-xcatliu JavaScript高级程序设计(第...

  • 今年想看的前端入门书籍

    《JavaScript 权威指南(第6版)》《JavaScript 高级程序设计(第3版)》《JavaScript...

  • 2019-04-17

    JavaScript高级程序设计笔记 第一章 JavaScript简介 JavaScript历史回顾 JavaSc...

  • 《JavaScript高级程序设计》笔记2:在HTML中使用Ja

    参考原文:《JavaScript高级程序设计》笔记:在HTML中使用Javascript