对象的访问器属性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
红宝书p141,142
<script>
    /*
    * 访问器属性也有4个特性
    * [[configurable]]:能否删除
    * [[Enumerable]]:能否for-in循环
    * [[Get]]:读取属性是调用的函数,默认undefined
    * [[Set]]:写入属性是调用的含糊,默认undefined
    * 用Object.defineProperty()设置
    * */
    //举个栗子
    // var book = {
    //     _year: 2000,
    //     edition: 1
    // };

    // Object.defineProperty(book, "year", {
    //     get: function () {//只写get属性不能写,尝试写=>undefined"use strict"=>error
    //         return this._year
    //     },
    //     set: function (newValue) {//只指定set属性不能读,尝试写=>undefined"use strict"=>error
    //         if (newValue > 2000) {
    //             this._year = newValue;
    //             this.edition += newValue - 2000;
    //         }
    //     }
    // });
    //year在book中是访问器属性,通过对象方法访问的属性,book的默认属性有个_year前面的_下划线是一种记号,_xxx(下划线后面的xxx),xxx是访问器属性,而访问器属性有两个函数getter和setter。上例中getter函数返回_year的值。setter通过定义的函数计算正确的结果。

    //两个非标准方法__defineGetter__(),__defineSetter__(),使用两个遗留方法,可以重写上述代码
    // book.__defineGetter__("year",function () {
    //     return this._year;
    // });
    // book.__defineSetter__("year",function (newValue) {
    //     if (newValue > 2000){
    //         this._year = newValue;
    //         this.edition += newValue - 2000;
    //     }
    // });

    //还有一种方法,可以同时定义多个属性Object.defineProperties();两个参数,第一个是要添加和修改其属性的对象,第二个对象的属性要与第一个对象中要添加或修改的属性要一一对应,要注意的是使用该方法后不声明configurable,enumerable,writable特性默认都为false。如下:
    var book = {};
    Object.defineProperties(book, {
        _year: {
            value: 2000,
            writable:true,
            configurable:true
        },
        edition: {
            value: 1,
            writable:true
        },
        year: {
            configurable:true,
            get:function() {
                return this._year
            },
            set:function(newValue) {
                if (newValue > 2000) {
                    this._year = newValue;
                    this.edition += newValue - 2000;
                }
            }
        }
    });

    book.year = 2020;
    console.log(book);
    delete book.year;
    console.log(book)
</script>
</body>
</html>
发布了37 篇原创文章 · 获赞 43 · 访问量 4862

猜你喜欢

转载自blog.csdn.net/printf_hello/article/details/104237299