zoukankan      html  css  js  c++  java
  • javascript中的对象

    也许你经常听别人说"javascript中万物皆对象",这句话是错的

      在讲这个问题前,我们来了解下对象的声明方式

    1.文字语法                                                                                                                      

    var myObj = {
    key: value
    // ...
    };

    2.构造形式                                                                                                                      

    var myObj = new Object();
    myObj.key = value;

     唯一的区别是,在文字声明中你可以添加多个键 / 值对,但是在构造形式中你必须逐个添加属性。

    对象是 JavaScript 的基础。在 JavaScript 中一共有六种主要类型(术语是“语言类型”):
      string •       
      number •    
      boolean •     
      null •          
      undefined •
      object •      

    在这里面,我们可以看到null也是简单基本类型的一种,但有时null也被当作对象类型,typeof null//"Object"

    为什么我们可以使用简单基本类型的"属性?"                                                                              

    "abc".length//3

    类似上面的代码,我们知道了在调用字面量的时候,引擎把字面量转换成了相应的对象

    内容                                                                                                                                

      从上面我们知道了一个对象可以通过文字语法和构造语法来生成,那么它的属性该怎么办?

    var d={
      a:1,
      b:function(){
         console.log(this.a);  
        }  
    }

      需要说明的是,属性只是对值的一个引用,真正的值是放在内存中,存放的位置由编译器决定

    我们都知道访问对象的属性有两种方法

    1.通过.访问属性                                                                                                

    a.b
    c.d

    2.通过属性名称                                                                                                  

    a["b"]
    c["d1"]

      这两个的区别在于,一个可以输入非法字符-=-,请看下面的代码

            var d={
                "fd-!":2
            };
            console.log(d["fd-!"]);//2
            console.log(d.fd-!);//错误

    有可能你需要在某个对象上加一个固定的前缀,那么你这里这样                                             

    var prefix = "foo";
    var myObject = {
    [prefix + "bar"]:"hello",
    [prefix + "baz"]: "world"
    };
    myObject["foobar"]; // hello
    myObject["foobaz"]; // world

    讲到这里,你可能会觉得javascript和其他的语言比会有所不足,其实不是不足,而是我们了解的不够深,

      比如你有可能会问,在C#中属性有Get/Set你的在哪里呢?!!别急,接着往下看

    属性与方法                                                                                                         

        属性描述符                              

            var d={a:100000};
            console.log(Object.getOwnPropertyDescriptor(d,"a"));

    在这里我们就知道了,一个属性默认有3个描述符

        1.可写(writable)

        2.可枚举(enumerable)

        3.可配置(configurable)

      在这里就详细的介绍这些了,你还可以用下面的方法做一些有趣的事情

    1 禁止扩展                                                                                  
      如果你想禁止一个对象添加新属性并且保留已有属性,可以使用 Object.prevent
      Extensions(..) :
      var myObject = {
      a:2
      };
      Object.preventExtensions( myObject );
      myObject.b = 3;
      myObject.b; // undefined

    2. 密封                                                                                       
      Object.seal(..) 会创建一个“密封”的对象,这个方法实际上会在一个现有对象上调用
      Object.preventExtensions(..) 并把所有现有属性标记为 configurable:false 。
      所以,密封之后不仅不能添加新属性,也不能重新配置或者删除任何现有属性(虽然可以
      修改属性的值)


    3. 冻结                                                                                        
      Object.freeze(..) 会创建一个冻结对象,这个方法实际上会在一个现有对象上调用
      Object.seal(..) 并把所有“数据访问”属性标记为 writable:false ,这样就无法修改它们
      的值。

     Getter和Setter                                                                                                        

    var myObject = {
    // 给 a 定义一个 getter
    get a() {
    return 2;
    }
    };
    Object.defineProperty(
    myObject, // 目标对象
    "b", // 属性名
    { // 描述符
    // 给 b 设置一个 getter
    get: function(){ return this.a * 2 },
    // 确保 b 会出现在对象的属性列表中
    enumerable: true
    }
    );
    myObject.a; // 2
    myObject.b; // 4

    遍历                                                                                              

    常用的遍历方法有 

      1.for(var t in ddd)

        var arra1=[1,2,3,4];
        for(var t in arra1){
            console.log(arra1[t]);//1,2,3,4
        }

      2.forEach(function(){})

        arra1.forEach(function(i){
            console.log(i);//1,2,3,4
        });

      3.some()  运行到程序返回true

        arra1.some(function(i){
            console.log(i);//1,2,3,4
            if(i==4){
            return true;
            }
        });

      4.every()  运行到程序返回false 

        var arra1=[1,2,3,4];
        arra1.every(function(i){
                console.log(i);//1,2,3,4
                return i<5;
        });

      5.for(var t of ddd)

        var arra1=[1,2,3,4];
        for(var t of arra1){
            console.log(t);//1,2,3,4
        }

    上面的数组可以枚举是因为他默认有@@iterator,下面我们来看看他的实现  

        var array1=[1,2,3,4];
        var it=array1[Symbol.iterator]();
        var zi=it.next();
            while(!zi.done){
                console.log(zi);
                zi=it.next();
            }

    当然我们也可以创建自己的迭代器,请看代码

            var temp={
                a:1,
                b:2,
                c:3
            };
            Object.defineProperty(temp,Symbol.iterator,{
                value:function(){
                    var o=this;
                    var id=0;
                    var ks=Object.keys(o);
                    return{
                        next:function(){
                            return{
                                value:o[ks[id++]],
                                done:id>ks.length
                            }
                        }
                    }
                }
            }
            );
            for(var t of temp){
                console.log(t);//1,2,3
            }
    Hold on, everything is possible.
  • 相关阅读:
    Android--Service之AIDL传递复杂对象
    Android--广播BroadcastReceiver
    Android--拦截系统BroadcastReceiver
    Android--操作图片Exif信息
    Android--Activity的启动模式
    Android--Task和BackStack高级
    终于完成了Josephus的C语言实现啦~~
    如何将.SQL文件的数据导入到Mysql的数据库中
    什么情况下要加上【javascript:】
    路径的写法
  • 原文地址:https://www.cnblogs.com/student-note/p/6646399.html
Copyright © 2011-2022 走看看