JavaScript系列——对象


前言

对象为一组属性的无序集合。严格来说,这意味着对象就是一组没有特定顺序的值。对象的每一个属性或方法都由一个名称来标识,这个名称映射到一个值。


一、创建对象

1、字面量创建(无法实现代码复用,但很便捷)

	const obj = {
            name: 'jack',
            age: 20,
            sex : '男'
        }

2、工厂模式

//工厂函数
        function createPerson(name, age, sex) {
            let o = new Object();
            o.name = name;
            o.age = age;
            o.sex = sex;
            o.sayName = function () {
                console.log(this.name);
            }
            return o;
        }
        let o1 = createPerson('jack', 20, '男');
        let o2 = createPerson('Tom', 21, '男');

这种工厂模式虽然可以解决创建多个类似对象的问题,但没有解决对象标识的问题(即新创建的对象是什么类型)。

3、构造函数模式

//构造函数
        function Person(name, age, sex) {
            this.name = name;
            this.age = age;
            this.sex = sex;
            this.sayName = function () {
                console.log(this.name);
            }
        }
        let obj1 = new Person('jack', 20, '男');
        let obj2 = new Person('Tom', 21, '男');

1、new操作符。以这种方式调用构造函数会执行以下操作。
(1)、在内存中创建一个新对象。
(2)、新对象内部的–proto–特性被赋值为构造函数的prototype属性。
(3)、构造函数内部的this属性被赋值为这个新对象(即this指向新对象)。
(4)、执行构造函数内部的代码(给新对象添加属性)。
(5)、若构造函数返回非空对象,则返回该对象,否则返回刚创建的新对象。
2、构造函数的问题
构造函数定义的方法会在每个实例上都创建一遍。

二、理解对象

1、对象属性的类型

对象的属性名称可以是:字符串,数字,符号(symbol)。
属性分两种:数据属性和访问器属性。

(1)、数据属性

[[Configurable]]:表示属性是否可以通过delete删除并重新定义,是否可以修改他的特性,以及是否可以把它改为访问器属性。
[[Enumerable]]:表示是否可以通过for-in循环返回。
[[Writable]]:表示属性的值是否可以被修改。
[[value]]:包含属性的值。

let obj = {name:‘tom’,age:‘18’};像这样属性显示添加到对象之后,数据属性都会被设置为true。

		//字面量创建
        const obj = {
            name: 'jack',
            age: 20,
            sex: '男'
        };
        console.log(Object.getOwnPropertyDescriptors(obj));
        /*  age: {value: 20, writable: true, enumerable: true, configurable: true}
            name: {value: 'jack', writable: true, enumerable: true, configurable: true}
            sex: {value: '男', writable: true, enumerable: true, configurable: true} 
        */
        const obj2 = {};
        obj2.name = 'tom';
        console.log(Object.getOwnPropertyDescriptors(obj2));
        // name:{ value: 'tom', writable: true, enumerable: true, configurable: true }

Object.defineProperty的方法可以修改属性的默认特性。

	const obj3 = {};
        Object.defineProperties(obj3, {
            name: {
                value: 'kangkang',
            },
            age: {
                value: 18,
                configurable: true,
                enumerable: true
            }
        })
        console.log(Object.getOwnPropertyDescriptors(obj3));
        /*
        age: {value: 18, writable: false, enumerable: false, configurable: true}
        name: {value: 'kangkang', writable: false, enumerable: false, configurable: false} 
        */

(2)、访问器属性

[[Configurable]]:表示属性是否可以通过delete删除并重新定义,是否可以修改他的特性,以及是否可以把它改为访问器属性。
[[Enumerable]]:表示是否可以通过for-in循环返回。
[[Get]]:获取函数,在读取属性时使用。
[[Set]]:设置函数,在写入属性时调用。

		let book = {
            year_ : 2017,
            edition:1
        };
        Object.defineProperty(book,'year',{
            get(){
                console.log('获取函数');
                return this.year_
            },
            set(newValue){
                this.year_ = newValue;
            }
        })

2、设置属性和读取属性的特性

代码如下(示例):

//设置属性
	let book = {};
        Object.defineProperty(book,'year',{
            value: 2017,
            enumerable:true,
            configurable:true,
            writable:true
        })
        let book = {};
        Object.defineProperty(book, 'year', {
            value: 2017,
            enumerable: true,
            configurable: true,
            writable: true
        })
        Object.defineProperties(book, {
            name: {
                value: '三国',
            },
            color: {
                value: 'white',
                enumerable: true,
                configurable: true,
                writable: true
            }
        })
        //读取属性的特性
        // Object.getOwnPropertyDescriptor()
        console.log(Object.getOwnPropertyDescriptor(book,'year'));
        // {value: 2017, writable: true, enumerable: true, configurable: true}
        console.log(Object.getOwnPropertyDescriptor(book,'name'));
        // {value: '三国', writable: false, enumerable: false, configurable: false}

        
        //Object.getOwnPropertyDescriptors()
        console.log(Object.getOwnPropertyDescriptors(book));
        /* {
                color: {value: 'white', writable: true, enumerable: true, configurable: true}
                name: {value: '三国', writable: false, enumerable: false, configurable: false}
                year: {value: 2017, writable: true, enumerable: true, configurable: true}
            }
         */

2、如何判断一个变量是一个对象。

		//如何判断一个变量是一个对象 
        let obj4 = {}
        Object.prototype.toString(obj4)//[object Object] 推荐使用这个,最准确
        obj4.constructor === Object; //true
        obj4 instanceof Object ; //true

3、原型链

在这里插入图片描述

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值