对象

1.对象

1.1 对象的创建(单个 2种)

(1)字面量模式
    var obj = {
        name:'zhangsan',
        age:18,
        '123':'number'
    }
    对象可以有多个属性,属性名一般不添加引号,特殊情况的需要加引号,比如上面的'123',即不符合命名规范的。
(2)构造函数模式
    var obj = new Object()
    obj.name = 'zhangsan';
    obj.age = 20;

1.2 对象的访问

(1)属性访问
    a.点访问
        obj.name;
    b.中括号访问
        obj['name'];
        注意:中括号里里面需要的属性需要用引号引起来
(2)方法的访问:方法的访问主要是为了执行该对象中的方法,需要按照函数调用的方式去使用
    //以下的执行结果是不一样的。
    obj.sayName();
    obj.sayName();//方法的使用
(3)遍历对象中的属性: for...in用于遍历数组或者对象的属性
    for(自定义变量名 in 数组/对象){
        执行代码
    }
    for(var key in obj){
        var value = obj[key];
    }

1.3 新增删除对象中的属性

(1) 只能删除对象的自有属性
    delete obj.name;
    delete obj['name'];
    delete obj.sayName//从obj对象中删除sayName属性
(2)新增属性
    obj.name = 'value';

1.4 Object显示类型转换(强制类型转换 3种)

1.4.1 Object类型到Boolean类型

(1) 使用Boolean包装器进行转换
    //除了空引用(null)会被转为false,其他的都会被转为true
    var obj = {
        name:'zhansan',
        age:18
    }
    console.log(Boolean(obj));//true
    使用Boolean包装器进行转换时,有如下规则
数据类型 转换为true的值 转换为false的值
Boolean true false
String 任何非空的字符串 ""(空字符串)
Number 任何非零数字(包括无穷大) 0和NaN
Object 任何对象 null
Undefined undefined

1.4.2 Object类型转String类型

转换规则(对象转String)
(1) 先调用对象的toString方法
(2) 判断该方法的返回值是否为基础数据类型
(3)若返回值为基础数据类型,则转换规则按照相应数据类型的转换规则对其进行转换
(4)若返回值不是基础数据类型,则在该返回值的基础上继续调用valueOf方法
(5)判断valueOf的返回值是否为基础数据类型
(6)判断是否为基础类型,若是基础数据类型则进行操作(3)
(7)若仍旧不为基础数据类型则报错

1.4.3 Object 类型转Number类型

转换规则(对象转Number)
(1)先调用对象的valueOf方法
(2)判断该方法的返回值是否为基础数据类型
(3)若返回值是基础数据类型,则转换规则按照相应数据类型的转换规则对其进行转换
(4)若返回值不为基础数据类型,则在该返回值的基础上继续调用toString方法
(5)判断toString的返回值是否为基础数据类型
(6)判断是否为基础数据类型,若是基础数据了类型则进行操作(3)
(7)若仍旧不为基础数据类型则报错。

1.5 检测属性(3种)

(1)in 检测某属性是否是某对象的自有属性或者是继承属性
    var obj = {
        name:'zhangsan',
        age:18
    }
    console.log('name' in obj);//true
    console.log('age' in obj);//true
    console.log('toString' in obj);//true 继承属性
(2) Object.prototype.hasOwnProperty() 检测给定的属性是否是对象的自有属性,对于继承属性将返回false
        var obj = {
            name:'zhangsan',
            age:18
         }
        console.log(obj.hasOwnProperty('name'));//true
        console.log(obj.hasOwnProperty('toString'));//false 不是自有属性
(3)Object.prototype.propertyIsEnumerable() 是hasOwnProperty()的增强版,除了是自身属性外,还要求是可枚举属性,即我们自己创建的属性
    var obj = {
         name:'zhangsan',
         age:18
     }
    console.log(obj.propertyIsEnumerable('name'));//true
    console.log(obj.propertyIsEnumerable('toString'));//false 不是可枚举属性

1.6 Object原型属性及方法(原型方法,实例可以调用的方法)

对象_第1张图片

Object原型种常用的方法

(1)constructor  
    保存用户创建当前对象的函数,与原型对象对应的构造函数
(2)hasOwnProperty(propertyName)
    检查对象的属性名是否是对象的自有属性
(3)propertyIsEnumerable(propertyName)
    检查给定的属性在当前对象实例中是否存在
(4)valueOf()
    返回对象的字符串,数值,布尔值的表示
(5)toLocaleString()
    返回对象的字符串表示,该字符串与执行环境的地区对应
(6)toString()
    返回对象的字符串
(7)isPrototypeOf(Object)
    检查传入的对象的原型
    a.isPrototypeOf(b) 如果a是b的原型,则返回true,如果b不是对象,或者a不是b的原型,则额返回false。

1.7 深入理解对象-定义属性

1.7.1 数据属性特性

数据属性 例如name属性
  (1)[[Configurable]]:表示是否通过delete删除属性而重新定义属性,默认为true,当为false时,不能删除
  (2)[[Enumerable]]:表示能否通过for-in循环返回属性,默认为true,当为false时,不能循环
  (3)[[Writable]] :表示能否修改属性的值。(属性直接定义在对象中,默认为true)
  (4)[[Value]] : 包含这个属性的值 name:jacky
  要修改属性默认的特性,必须使用ECMAScript5的Object.defineProperty(obj,prop,descriptor)方法
  参数说明:1. obj:必需。目标对象
            2. prop:必需。需定义或修改的属性的名字 
            3. descriptor: 必需。目标属性所拥有的特性
   返回值:传入函数的对象,即第一个参数obj;
    Object.defineProperty(obj,'name',{
        configurable:true,
        enumeralbe:true,
        writable:true,
        value:'terry'
    })
    console.log(obj.name);
    注意:当我们创建一个对象并且为对象设置一个属性的时候,该属性默认特性Configurable、Enumerable、Writable默认都为true,value为该属性的值。
    Object.defineProperties()
    语法:Object.definePropertise(obj,props)
    参数说明:
            1.obj:必需。目标对象
            2.props:该对象的一个或多个键值对定义了将要为对象田添加或修改的的属性的具体配置。
    返回值:传入函数的对象,即第一个参数obj;
    var obj = new Object();
    Object.defineProperties(obj,
        name:{
            value:'zhangsan',
            configurable:false,
            writable:true,
            enumerable:true
        },
        age:{
            value:18,
            configurable:true
        }
    })
    console.log(obj.name,obj.age);

1.7.2 读取属性的特性

(1)Object.getOwnPropertyDescriptor
    功能:该方法返回指定对象上一个自有属性对应的属性描述符(自有属性指的是直接赋予该对象的属性,不需要从原型链上进行查找的属性)
    语法:Object.getOwnPropertyDescriptor(obj,prop);
    obj: 需要查找的目标对象
    prop: 目标对象内属性名称
    var person = {
        name:'张三',
        age:18
    }
    var desc = Object.getOwnPropertyDescriptor(person,'name');
    console.log(desc);//输出结果如下
    //configurable:true,
    //enumerable:true,
    //writable:true,
    //value:'张三'
(2)Object.getOwnPropertyDescriptors(obj)
    功能:所指对象的所有自身属性的描述符,如果没有任何自身属性,则返回空对象
    语法:Object.getOwnPropertyDescriptors(obj) obj为需要查找的目标对象

1.7.3 访问器属性特性

访问器属性:这个属性不包含数值,包含的是一对get和set方法,在读写访问器属性时,就是通过这两个方法来进行处理操作的
访问器属性包含的四个特性:
(1)[[Configurable]]:表示能否通过delete删除属性而重新定义属性,能否修改属性的特性,或能否把属性修改为访问器属性,默认为false
(2)[[Enumerable]]:表示能否通过for-in循环返回属性,默认为false
(3)[[Get]]: 在读取属性时调用的函数,默认值为undefined
(4)[[Set]]: 在写入属性时调用的函数,默认值为undefined
访问器属性不能直接定义,要通过Object.defineProperty()这个方法来定义。
var book = {
    _year: 2020,//下划线表示内部属性,只能通过对象的方法来独写
    editor: 1
};
Object.defineProperty(book,'year',{
    get:function(){
        return this._year;
    },
    //若只指定get方法,不指定set方法,那就默认该属性是只读的
    set:function(newYear){
        if(newYear !== this._year)
        this._year = newYear;
        this.editor++;
    }
})
//测试访问属性中的get,set方法
console.log('未修改的year:'+book.year);//2020
book.year = 2021;
console.log('修改后year:'+book.year);//2021
console.log('修改year后的editor:'+book.editor);//2
//访问器属性可以通过Object.getOwnPropertyDescriptor()查询
console.log(Object.getOwnPropertyDescriptor(book,'_year'));
console.log();
由上可以想到数据的双向绑定:
    a.在一个对象(book)中设置一个私有属性(_year:开头下划线代表私有属性),再为这个对象设置访问器属性year(本身还未在对象中定义)
    b.当book.year进行修改时触发set函数,通过这个函数进行数据的操作,比如数据的判断赋值等一系列操作,从而实现数据的双向绑定。

1.8 对象序列化

(1)对象序列化是指将对象的状态转换为字符串,也可以反序列化,将字符串还原为对象函数
(2)RegExp、Error对象,undefined值不能序列化和反序列化
(3)JSON.stringify(obj)将对象序列化为JSON字符串,只能序列化对象可枚举的自有属性。
(4)JSON.parse(jsonStr)反序列化

你可能感兴趣的