乐趣区

关于javascript:对象

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 原型属性及办法(原型办法,实例能够调用的办法)

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)反序列化
退出移动版