zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    linux 命令——19 find (转)
    linux 命令——18 locate (转)
    linux 命令——17 whereis(转)
    linux 命令——16 which(转)
    linux 命令——15 tail (转)
    linux 命令——14 head (转)
    Java for LeetCode 038 Count and Say
    Java for LeetCode 037 Sudoku Solver
    Java for LeetCode 036 Valid Sudoku
    Java for LeetCode 035 Search Insert Position
  • 原文地址:https://www.cnblogs.com/lindang/p/14120377.html
Copyright © 2011-2022 走看看