《JS高程(3)》-第6章笔记(01)

本文探讨了JavaScript中对象的概念及其实现方式,包括创建对象的不同方法、数据属性与访问器属性的区别及其特性配置,同时介绍了如何利用Object.defineProperty()方法进行属性特性的定制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第六章 面向对象的编程

6.1 理解对象

创建对象方式
1. 创建 Object实例,并添加属性和方法:
   var cat = new Object( ) ; 
   //var cat = { } ;
   cat.name='果冻' ;
2. 对象字面量创建实例(常用):

    var cat = {name : '果冻'};

属性类型
(内部采用的特性 / 属性的各种特征 / 实现JavaScript引擎 / 不能直接访问 /规范:例[[Enumerable]])
1. 数据属性

A.[[Configurable]] :默认值(true),判断是否能从对象中删除(delete)属性并重新定义;

B.[[Enumerable]]:默认值(true),判断是否能通过for-in返回对象属性;

C.[[Writable]]: 默认值(true),判断能否直接在对象上定义属性;

D.[[Value]]: 默认值(undefined),包含这个属性的数据值,用于数据的读取/写入。

属性默认特性修改方式:Object.defineProperty(),该方法接收三个参数:属性所在的对象、属性的名字和一个描述符对象。描述符(descriptor)对象的属性必须是:configurable、enumerable、writable和value。

        var person = {};
        Object.defineProperty(person, 'name', {
            writable:false,
            configurable:false,
            value:'Nicholas'
        });
        console.log(person.name);//'Nicholas'
        person.name = 'Greg';
        console.log(person.name);//'Nicholas'

        //调用Object.defineProperty()方法时,
        //configurable、enumerable和writable特性默认值为false。
        //该方法,多用于理解JavaScript对象。
2. 访问器属性
(不包含数值/ 属性的各种特征 / getter&setter (不必须)/ getter返回有效的值 /setter 决定如何处理数据)

A.[[Configurable]] :默认值(true),判断是否能从对象中删除(delete)属性并重新定义;

B.[[Enumerable]]:默认值(true),判断是否能通过for-in返回对象属性;

C.[[Get]]: 默认值(undefined),读取属性时调用的函数;

D.[[Set]]: 默认值(undefined),写入属性时调用的函数。

属性默定义方式:Object.defineProperty(),必须使用该方法定义,不可直接定义。

        var book = {
            _year: 2004,
            edition: 1
        };
        Object.defineProperty(book, 'year', {
            get:function(){
                return this._year;
            },
            set:function(newValue ){
                if (newValue > 2004){
                    this._year = newValue;
                    this.edition += newValue - 2004;
                }
            }
        });
        book.year = 2005;
        console.log(book.edition); //2

创建了一个book对象,并定义了两个默认的属性:_year 和 edition。

_year 前的下划线,表示只能通过对象方法访问的属性。

year 访问器属性,包含setter和getter函数,getter函数返回_year的值,setter函数通过计算来确定正确的版本。

访问器属性常见的方法:设置一个属性的值导致其他属性发生变化。


定义多个属性

方法 : Object.defineProperties()
参数 : 第一个对象是要添加和修改其属性的对象,第二个对象的属性与第一个对象重要添加或修改的属性一一对应。

        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;
                    }
                }
            }
        }); 
        //与Object.defineProperty的区别是这里的属性都是同一时间创建的。

读取属性的特性

方法 : Object.getOwnPropertyDescriptor()

参数 : 属性所在的对象和要读取其描述符的属性名称。

返回值
a . 访问器属性:configurable 、enumerable 、get和set;
b . 数据属性: configurable、enumerable 、writable和value.

        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(typeof 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"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值