javascript 跳跃式前进 (4) - 对象基础理论

2024-01-26 10:12:56 浏览数 (2)

前言

ECMAScript中我觉得非常重要的一块就是对于对象的理解了,就我个人而言,我的理解还是不够透彻的; 所以这篇文章不扯多深,只扯扯比较表层的知识;

何为面向对象

面向对象的定义是比较好比喻的,比如一个人,有什么特征,这是特征就是对象属性,而不同的人又相同的地方和自身亮点; 这样就是从单一对象过渡到继承,拓展;[注:ES6之前没有类的说法,原生的继承也是不存在的;模拟居多]

ECMA的定义就是: “无序属性的几何,其属性可以包含基本值,对象或者函数.”

在JS中,声明对象的方法有这么两种:声明和字面量;

代码语言:javascript复制
    var x = {}; 
    vay y = new Object(); 

    x.name = "crper"  

然而,从ES5开始,规范和定义就越发丰富了,现在我们来扯扯ES5新增或者完善老版本的;

属性类型

ECMAScript中有两种属性: 数据属性和访问器属性;

数据属性有四个行为特性: 1. [[Configurable]] : 若是设置为true,可以通过delete删除属性;若是false,则不可!!! 默认为true; 2. [[Enumerable]] : 是否允许for-in这类循环遍历属性值,默认为true; 3. [[Writable]] : 是否允许修改对象的属性值,默认为true; 4. [[Value]] : 对象的属性值,默认为undefined;

若是要修改其对象的行为特性,需要用Object.defineProperty来实现[也可以理解为定义对象属性], 格式:Object.defineProperty(obj,attribute,{行为特性或带值}) 看demo;

代码语言:javascript复制
    var x = {};
    x.name = "crper";

   
    Object.defineProperty(x,"age",{
        writable:false,
        configurable:false,
        value:23
    }) 

访问器属性有四个特性: 1. [[Configurable]] : 与数据属性一致; 2. [[Enumberable]] : 与数据属性一直; 3. [[Get]] : 在读取属性的时候调用函数,默认值为undefined; 4. [[Set]] : 在写入属性值的时候调用函数,默认值为undefined;

代码语言:javascript复制
   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);    

定义多个属性

代码语言:javascript复制
   var my = {};
   Object.defineProperties(my,{
       name:{
            value:"crper"
       },
       age:{
          value:23
      },
      read:{
           get:function(){
                 return this.age;
           },
           set:function(value){
                if(value > 24){
                      return this.age  = (value - 24);
              }
          }
      }
   });

读取属性特性

读取属性特性可以使用Object,getOwnPropertyDescriptor(obj,attribute)方法; 返回值是数据属性和访问器属性 接着上面一个例子;

代码语言:javascript复制
Object.getOwnPropertyDescriptor(my,"age") ;   

Object.getOwnPropertyDescriptor(my,"name");  

Object.getOwnPropertyDescriptor(my,"read"); 

创建对象

代码语言:javascript复制
.... 梳理中 ... 放到下一篇相关的文章

总结

至于对象的几种创建模式及继承的实现,我还要梳理一下,顺便把ES6的实现方法也穿插进去。。。 静候佳音~~~学习ing。。。。。

0 人点赞