JS之对象精讲(一)

文章目录

    • 对象的属性和访问方式
      • 对象的属性
        • 数据属性
        • 访问器属性
      • 属性的访问方式
    • 创建对象
      • 1.基于Object()构造函数
      • 2.基于对象字面量
      • 3.基于工厂方法模式
      • 4.基于构造函数模式
      • 5.基于原型对象的模式
      • 6.构造函数和原型混合模式
      • 7.基于动态原型模式
    • 对象克隆
      • 浅克隆
      • 深克隆
        • JSON序列化和反序列化
    • 原型对象
      • 原型对象、构造函数、实例之间的关系
        • 实例属性的读取顺序
        • 重写原型对象
      • 原型链
        • 原型链的特点
        • 属性区分
        • _proto_属性

JS虽然是一门弱类型语言,但它同样是一门面向对象的语言。

对象的属性和访问方式

对象的属性

对象就是一组键值对的集合【属性名称:属性的值】
对象的属性可以分为数据属性和访问器属性。

数据属性

[[Configurable]]:表示属性能否删除而重新定义,默认值为true
[[Enumerable]]:表示属性是否可以枚举,可枚举的属性可以通过for…in循环返回,默认是true
[[Writable]]:表示属性值能否被修改,默认值为true
[[Value]]:表示属性的真实值,属性的读取和写入均通过此属性完成,默认值为undefined
定义一个包含name属性的对象person

  var person={
   
        name:'nick'
    };

如果要修改数据属性默认的特性,则必须使用Object.defineProperty()函数

 Object.defineProperty(person,'name',{
   
        configurable:true,
        enumerable:false,
        writable:false,
        value:'nick'
    })

第一个参数表示目标对象,第二个参数表示要修改的属性,第三个参数是一个描述符对象,描述符对象的属性必须为configurable、enumerable、writable、value。

访问器属性

访问器属性也包含四个特性,分别是
[[Configurable]]
[[Enumerable]]
[[Get]]:在读取属性时调用的函数(一般称为getter()函数),负责返回有效的值,默认值为undefined
[[Set]]:在写入属性值时调用的函数(一般称为setter()函数),负责处理数据,默认值为undefined
getter()函数和setter()函数可以实现对象的私有属性。

   var person={
   
        _age:10
    };
    Object.defineProperty(person,"age",{
   
        get:function(){
   
            return this._age;
        },

        set:function(newValue){
   
            if(newValue>10){
   
                this._age=newValue;
                console.log('设置成功');
            }
        }
    });
    console.log(person.age); //10
    person.age=19;
    console.log(person.age); //19

一般以下划线开头的属性就是私有属性,通过Object.defineProperty()函数为person对象定义为一个age属性,用于对_age属性的读取和写入。
读取age属性时,直接返回对象的_age属性。

属性的访问方式

对象属性有两种访问方式:点操作符中括号操作符
对象名称.对象属性
对象名称[对象属性]
不同之处:
1.点操作符时静态的,而且无法修改,中括号操作符是动态的,可以传递字符串或者变量,在运行时可以修改。

    var obj={
   };
    obj.name='张三';
    var myName='name';
    console.log(obj.myName);  //undefined
    console.log(obj[myName]); //张三

2.点操作符不能以数字作为属性名,中括号操作符是可以的。

    var obj={
   };
    // obj.1=1;
    obj[2]=2;
    console.log(obj[2]);

3.属性名中包含会导致语法错误的字符,或者是关键字、保留字,可以使用方括号操作符,而不能使用点操作符。

    var person={
   };
    person['first name']='nick';
    console.log(person['first name']);

其实访问对象的属性用点操作符已经可以满足大部分场景了。

创建对象

1.基于Object()构造函数

通过Object对象的构造函数生成一个实例,然后给它增加需要的各种属性

    

你可能感兴趣的:(精讲JS,javascript,开发语言,正则表达式,json,前端)