1. 程式人生 > >javascript物件基礎(使用物件)---2物件、屬性、方法的高階操作-Object

javascript物件基礎(使用物件)---2物件、屬性、方法的高階操作-Object

三、物件的高階用法(ECMScript5):Object  Array  Function String

    Object ------

     1.  建立物件(前面使用的是1.使用物件直接量2.通過new建立物件)

          Object.create(prototype,descriptors) //prototype為必需引數,要用作原型的物件,可以為null;第二個可選,屬性描述項物件 ,即descriptors是個javascript物件{}

           //資料屬性描述符包含value特性:writable  enumerable  configurable,若未指定 都預設為false

          //訪問器屬性描述符:設定屬性值的函式set     返回屬性值的函式get

         1.1  var newObj.create(null,{

               size:{

                   value:'large',

                   enumerable:true

                    },

              shape:{

                     value:"round",

                    enmumerable:true

                  }

            })

        newObj.size;//large    newObj.shape;//round

        Object.getPrototypeOf(newObj);//null

   1.2使用Object.create建立一個與Object物件具有相同物件的原型物件

      var first={x:undefined,y:undefined}//定義的物件直接量

         var   second=Object.create(Object.prototype,{

           x:{

                 value:undefined,

                writable:true,

               configurable:true,

               enumerable:true

              },

           

       y:{

                 value:undefined,

                writable:true,

               configurable:true,

               enumerable:true

               },

})

        Object.getPrototypeOf(first);//[object  Object]

       Object.getPrototypeOf(second);//[object  Object]

   2.1定義屬性:2個靜態函式  Object.defineProperty()、Object.defineProperties()

        Object.defineProperty(object,propertyname,desciptor)//將屬性新增到物件,或者修改現有屬性的特性

       Object.defineProperties(object,desciptors)//將多個屬性新增到物件,或者修改現有多個屬性的特性

    例:

       var obj={}

         Object.defineProperty(obj,"newDataProperty",{

           value:101,

           writable:true,

          enumerable:true,

         configurable:true

        });

        obj.newDataProperty=102;//將newDataProperty的值101修改為102

   document.write(obj.newDataProperty);//102

   

 var obj={}

         Object.defineProperties(obj,{

              newDataProperty:{

                  value:101,

                 writable:true,

                  enumerable:true,

                 configurable:true},

                 newAccessorProperty:{

                  set:function(x){this.newaccpropvalue=x},

                  get:function(){retrun this.newaccpropvalue}

              }

        });

     obj.newAccessorProperty=10;

  document.write(obj.newAccessorProperty);//10

  2.2.訪問屬性(前面使用的是1  .方式   2  陣列方式  3 for in)

  Object.getPrototypeOf(object);//返回指定物件object的原型

  Object.getOwnPropertyDesciptor(object,propertyname);//獲取指定物件object的私有屬性描述符

  Object.getOwnPropertyNames(object);返回指定物件object私有屬性的名稱,包括可列舉和不可列舉的屬性和方法的名稱

   Object.keys(object);返回僅可列舉的的屬性和方法的名稱,object也可以是建立的物件或現有的dom物件

  例:

  1.---   function Pasta(grain,width){

        this.grain=grain;

       this.width=width;

      }

   var spaghetti=new Pasta("wheat",0.2); var proto=  Object.getPrototypeOf(spaghetti)

   docuement.write(proto===Pasta.prototype);//true

   

 2--  function Pasta(grain,width,shape){

        this.grain=grain;

        this.width=width;

       this.toString=function(){

           return(this.grain+","+this.width+","+this.shape)

       }

      }

       var spaghetti=new Pasta("wheat",0.2,"circle");

   var arr=  Object.getOwnPropertyNames(spaghetti);

   docuement.write(arr);//grain,width,shape,toString

3--var obj={}

  obj.newDataProperty="abc",

  var descriptor=Object.getOwnPropertyDescriptor(obj,"newdataProperty");//獲得物件私有屬性的描述符

       descriptor.writable=false;//修改特性

    Object.defineProperty(obj,"newdataProperty",descriptor);//定義屬性

  var desc2=Object.getOwnPropertyDescriptor(obj,"newdataProperty");//獲得物件私有屬性的描述符

  for(var prop in des2){

      document.write(prop+':'+desc2[prop]);

      document.write("<br/>");

   }//value:abc   writable:false     enumerable:true     configruable:ture

     2.2配置屬性的特性

  Object.freeze(object);//阻止修改現有屬性的特性和值,以及新增新屬性

  Object.seal(object);//阻止修改現有屬性的特性,以及新增新屬性,但可以修改屬性的值

  Object.preventExtensions(object);//阻止新增新屬性,但修改屬性的特性和值

  舉例:

     1  var  obj={  pasta:"spahetti",length:10}

             Obeject.preventExtensions(obj);//只是阻止新增新屬性

            obj.newPorp=50;  obj.pasta=50;

            document.write(obj.newProp);//undefined 

            document.write(obj.pasta);//50

     

        2   var  obj={  pasta:"spahetti",length:10}

           Obeject.freeze(obj);

            obj.newPorp=50;  obj.pasta=50;

            document.write(obj.newProp);//undefined 

            document.write(obj.pasta);//"spahetti"

2.3檢測屬性的特性

  Object.isSealed(object);//如果無法再物件中修改現有屬性的特性,且無法向物件新增新屬性,則 返回true

  Object.isFrozen(object);//如果無法再物件中修改現有屬性的特性和值,且無法向物件新增新屬性,則 返回true

  Object.isExtensible(object);//如果可擴充套件(即可新增新屬性),則為true,否則返回false

  舉例:

     var  obj={  pasta:"spahetti",length:10}

    if(!Object.isFrozen(obj)){obj.pasta=50;}

    Object.freeze(obj)

   document.write(obj.pasta)