• js对象


    对象

    1. 创建对象

        1) 对象直接量:var obj1={}

        2) new 关键字:var obj2=new Object()

        3) Object.create()函数:var obj3=Object.create(prototype) //prototype是想要创建的对象的原型对象。

          egvar obj4=Object.create(Array.prototype)

        创建一个数组对象,此时的obj4继承了数组对象的所有方法和属性;

        相反,如果参数填一个null对象,那么会创建一个新的空对象,但是它不会继承任何的属性或方法:var obj4=Object.create(null)

       2. 对象属性及访问

      1) 属性

        对象是由一系列的“属性名:属性值”的键值对组成的由花括号{}包裹起来的变量。

        其中的属性名,也叫作键名,可以是任意的原始类型:字符串(包括空字符串),数字,布尔值,nullundefined;属性值可以是任意的数据类型,包括对象类型。

     

    {
    
    aa: null,
    
    bb: undefined,
    
    childern: {child1: "111"},
    
    null: 2,
    
    sebling:[1,2,3,4],
    
    true: 1,
    
    undefined: 31: 111
    
    }

      2) 属性的访问

        属性访问有两种方式:“对象.属性名”和“对象[属性名]”。

        使用.”的时候,属性名只能是一个标识符(可看做不加“”的字符串):obj.aa,如果属性名是数字或空字符串,不能写成obj.1obj.””,而是写成方括号形式,即obj[1]obj[“”]

    * 在使用方括号的时候,我们说方括号里只能返回字符串。严格来说,方括号里只能是可以转换成字符串的值。

        直接访问一个不存在的属性是不会报错的,会返回undefined,但间接访问一个不存在的属性则会报错。比如obj={},访问obj.name的时候返回undefined,访问obj.name.length的时候则会报length is undefined的错误。原因是obj.name已经是undefined了,undefined没有length属性。处理方法(最直接,最简洁):obj&&obj.name&&obj.name.length,返回的是undefined,而不会报错。

      3) 作为关联数组的对象

        普通的数组,我们在访问它的数组项的时候,都是通过数字索引值来访问的:arr[1],关联数组就是通过字符串索引来访问数组项的数组:arr[“1”]arr[“aaa”],也称为散列、映射或字典。

        javascript里的对象都是关联数组。

        当对象的属性名不确定时,必须使用方括号来访问,因为方括号里返回的字符串是动态的,在运行过程中可以更改,所以可以用一个变量来接收这个字符串值,然后方括号里使用这个变量,就可以访问这个不确定的属性的值了。

      4) 继承

        对象的属性一部分是自己本身的属性,另一部分可以是从原型链上的对象继承而来。当访问对象objx属性时,如果obj本身就有x属性,那就直接返回x的值;如果obj没有x属性,那么就在他的原型对象身上去找是否有x属性,有就返回这个值,没有就继续在obj的原型对象的原型对象身上去找......以此类推,直到找到x或者找到一个原型是null的对象为止,有就返回该值,没有就返回undefined。可以看到,对象的原型的属性构成了一个“链”,对象通过这条“链”来实现属性的继承。

      5) 属性赋值

        属性赋值首先要检查原型链,如果允许进行赋值操作,也总是在原始对象上创建属性或对已有属性进行赋值,而不会去更改原型链上的属性值。

    JavaScript中,只有在查询属性的时候才能体会到继承的存在,属性赋值跟继承无关。

      6) 删除属性

        删除属性用delete”。

        delete的一般用法是delete + 对象.属性名:delete obj.namedelete只能删除自身属性,不能删除继承属性。

        delete表达式如果删除成功或者无副作用时,会返回true;如下情况都返回true

        delete obj.gender 删除objgender属性,返回true

        delete obj.gender  obj.gender已经不存在,什么也不做,返回true

        delete obj.toString 删除继承属性,无效,什么也不做,返回true

        delete 1 表达式无意义,什么也不做,返回true

        delete 不能删除那些可配置性为false的属性,比如内置对象的prototype、全局var 变量、全局函数等

        delete Object.prototype 不可删除,属性不可配置,返回false

        var a=1delete a; var变量是不可配置变量,此处a不可配置,不可删除,返回false

        function f(){};delete f; 全局函数不可删除,返回false

        创建一个可配置的全局变量或方法时,delete表达式返回true,可删除:

          this.b=1;delete b; 可删除,返回true

          this.f1=function(){};delete f1; 可删除,返回true

      7) 检测属性

        var obj = {name:’123’,age:123,x:undefined}

        检测属性可以用in”运算符、hasOwnPropoerty方法、propertyIsEnumberable方法、Object.getOwnPropertyNames方法以及“!==undefined”来实现。

        * in运算符可以识别undefinednull,但是不会区分自身属性与继承。注意需要检测的属性名要加””,否则它表示的是一个变量,变量 in 对象,返回false

          “name” in obj;  //name存在于obj中,返回true

          “x” in obj;  //true

          “toString” in obj;  //true

          name in obj;  //false

          “sex” in obj;  //falseobj中不存在sex属性

        * hasOwnProperty方法也可以识别undefinednull,同时会区分自身属性与继承属性(属性记得加””)

          obj.hasOwnProperty(“name”);  //true

          obj.hasOwnProperty(“x”);  //true

          obj.hasOwnProperty(“toString”);  //false toString是继承属性,返回false

          obj.hasOwnProperty(“sex”);  //falseobj中不存在sex属性,返回false

        * propertyIsEnumberable 方法是 hasOwnProperty 的强化,在hasOwnProperty方法的特性下,还可以区分可枚举属性和不可枚举属性。有些内置对象的属性是不可枚举的,通常用JavaScript创建出来的属性是可枚举的。

          obj.propertyIsEnumberable(“name”);  //true

          obj.propertyIsEnumberable(“x”);  //true

          Object.prototype.propertyIsEnumerable('toString');  //false

     

        *Object.getOwnPropertyNames 方法获取自身的属性,而且能获取到可枚举值为false的属性

          var obj = {name:’ll’,age:21};

          Object.defineProperty(obj,’x’,{value:’123’,enumberable:false})

          Object.getOwnPropertyNames(obj);  // [‘name’,’age’,’x’]

     

        * 除了用“in”运算符判断属性是否为undefined外,“!==”也可以区分undefined null!==”的左右两边要求值和类型都必须一致时才返回true,而“!=”仅仅是值等就可以返回true

        * 对象属性的可枚举性:属性的可枚举性是通过定义属性的defineProperty方法中的enumberable属性来确定的,如果某个属性的enumberable的值定义为false,那么 for/in Object.keys()以及JSON.stringify()都不能遍历到该属性

        Object.defineProperty(obj,"sex",{value:"",enumberable:false})

        Object.keys(obj);  //["name", "x",”age”]

        JSON.stringify(obj);  //"{"name":"123",age:123}"  //JSON.stringify()也不能识别值为undefined的属性

     

      8) 属性的settergetter

        如果只有getter,那么getter的那个属性是只读,如果既有getter又有setter那么该属性是可读写的。setter属性必须要有一个参数    

    var obj1 = {
    
          x:1,
    
             y:2,
    
             get sum(){return this.x+this.y},
    
          set sum(newvalue){
    
            this.x += 1;
    
            this.y += 1;
    
            } // 作用????
    
           }
    
          obj1.sum  // 3
  • 相关阅读:
    线性回归损失函数求解
    【线性代数】四个基本子空间
    【线性代数】如何寻找一个投影矩阵
    【hihoCoder】#1133 : 二分·二分查找之k小数
    [LeetCode解题报告] 502. IPO
    [LeetCode解题报告] 703. 数据流中的第K大元素
    【排序】堆排序
    全文检索以及Lucene的应用
    MySql优化之mycat
    MySql优化之主从复制
  • 原文地址:https://www.cnblogs.com/lindang/p/14120377.html
Copyright © 2020-2023  润新知