学习笔记7--js面向对象

对象是无序属性的集合

属性类型

创建属性Object.defineProperty()
如果对象中不存在指定的属性,Object.defineProperty()就创建这个属性。当描述符中省略某些字段时,这些字段将使用它们的默认值。拥有布尔值的字段的默认值都是false。value,get和set字段的默认值为undefined。一个没有get/set/value/writable定义的属性被称为“通用的”,并被“键入”为一个数据描述符。

数据属性访问器属性
数据属性

[[Configurable]]表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属。直接在对象上定义的属性,默认值true
[[Writeble]]默认值true
[[Enumerable]]表示能否通过for-in循环返回属性。直接在对象上定义的属性,默认值true
[[Writable]]表示能否修改属性的值,直接在对象上定义的属性,默认值true
[[Value]]包含这个属性的数据值\

要修改属性默认的特性,必须使用Object.defineProperty()方法。这个方法接受三个参数:属性所在的对象,属性的名字,描述符对象(必须是configurable,enumerable,writable和value)。

var person = {};
    Object.defineProperty(person, "name", {
        writable: false,
        value: "Nicholas"
    });

    //Nicholas
    console.log(person.name);

    //非严格模式,赋值被忽略,严格模式下,赋值操作拋错
    person.name = "xiaohong";

    //Nicholas
    console.log(person.name);

一旦将configurable设置为false,表示不能从对象中删除属性,不能再把configurable设置为true。修改除writable之外的特性都会导致错误。

 Object.defineProperty(person, "name", { configurable: false, value: "Nicholas" });

    Object.defineProperty(person, "name", { value: "haha" });

访问器属性
访问器属性不包含数据值;包含一对getter和setter函数。在读取对象的某个属性时,会调用这个属性的getter函数。在修改对象的某个属性时,会调用这个属性的setter函数。

访问器属性有如下4个特性:
[[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为数据属性。
[[Enumerable]]:表示能否通过 for-in 循环返回属性。
[[Get]]:在读取属性时调用的函数。默认值为 undefined。
[[Set]]:在写入属性时调用的函数。默认值为 undefined。访问器属性不能直接定义,必须使用 Object.defineProperty() 来定义。

访问器属性常用于:设置一个属性值导致另一个属性值的变化。

只指定getter,属性不能写,在非严格模式下赋值会被忽略,严格模式下回拋错。
只指定setter,属性不能写,在非严格模式下返回undefined,严格模式下回拋错。


Object.defineProperty()定义多个属性


Object.getOwnPropertyDescriptor()
接收两个参数: 1 属性所在的对象, 2 要读取的描述符的属性名称
返回: 一个对象
如果是数据属性,这个对象有属性有,configurable, enumerable,writable,value
如果是访问器属性,这个对象有属性有,configurable, enumerable,get,set

        var book = {};
        Object.defineProperties(book, {

        //创建数据属性
        _year: {
            value: 2004
        },

        ////创建数据属性
        edition: {
            value: 1
        },

        //创建访问属性
        year: {
            get: function () {
                return this._year;
            },

            set: function (newValue) {
                if (newValue > 2004) {
                    this._year = newValue;
                    this.edition += newValue - 2004;
                }
            }

        }
    });

    //读取数据属性
    var descriptor = Object.getOwnPropertyDescriptor(book, "_year");
    console.log(descriptor.value);//2004
    console.log(descriptor.configurable);//false
    console.log(descriptor.get);//undefined

    //读取访问属性
    var descriptor = Object.getOwnPropertyDescriptor(book, "year");
    console.log(descriptor.value);//undefined
    console.log(descriptor.configurable);//false
    console.log(typeof descriptor.get);//function
    console.log(descriptor.enumerable);//false
全部评论

相关推荐

风中翠竹:真的真的真的没有kpi。。。面试官是没有任何kpi的,捞是真的想试试看这个行不行,碰碰运气,或者是面试官比较闲现在,没事捞个人看看。kpi算HR那边,但是只有你入职了,kpi才作数,面试是没有的。
双非有机会进大厂吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务