js对象的学习笔记

1.js对象的分类:a.内置对象(Array,Function,Date,RegExp);

         b.宿主对象(由js解释器所嵌入的宿主环境(web浏览器)定义的,可以把宿主对象当作内置对象);

         c.自定义对象(由运行中js代码所创建的对象)

2.对象的属性: a.自有属性(直接在对象中定义的属性);

        b.继承属性(在对象的原型对象中定义的属性);

3.对象的原型:每一个JS对象(null除外)都和另一个对象相关联,另一个对象就是我们熟知的原型,每一个对象都从原型继承属性(原型的最顶端Object.prototype是没有原型的,Object.prototype._proto_=null).所有通过对象直接量创建的对象都具有同一个原型对象,并且可以通过js代码Object,prototype获得原型对象的引用;通过关键字new和构造函数调用创建的对象的原型就是构造函数的prototype属性的 值。因此,同使用{}创建对象一样,通过new Object()创建的对象也继承子Object.prototype。同样,通过new Array()创建的对象的原型就是Array.prototype。通过new Date()创建的对象的原型就是Date.prototype.

       没有原型的对象不多,object.prototype就是其中之一,他不继承任何属性。其他的原型对象都是普通对象,其他的原型对象都是普通对象,普通对象都具有原型。所有的内置构造函数(以及大部分自定义构造函数)都具有一个继承自Object.prototype的原型。例如,Date.prototype的属性继承自Object.prototype,因此有new Date()创建的Date对象的属性同时继承自Data.prototype和Object.prototype.这一系列链接的原型对象就是所谓的“原型链”。

4.对象的原型继承:假设要查询对象o的x属性,如果o中不存在下,那么将会在o的原型对象中查询属性x。如果原型对象中也没有x,但这个原型对象也有原型,那么继续在这个原型对象的原型上执行查询,直到找到x或者找到一个原型是null的对象为止。可以看到,对象的原型属性构成了一个“链”,通过这个链可以实现属性继承。

        只有查询属性才能体会到继承的存在,而设置属性则和继承无关,这是js的一个重要特性,该特性让程序员可以有选择的覆盖继承属性。

        例:通过原型继承创建一个新对象

          function inherit (p ){

              if(p==null) throw TypeError();

              if(Object.create){

                 return  Object.create(p);

                        //这里的Object.create()是一个js原生继承对象的方法,

                              var father={x:1};    

                              var child=Object.create(father);

                              console.log(children.x)

              }else{

              var t=typeof p;

              if( t!=="object" && t!=="function") throw TypeError();

              function f(){};

              f.prototype=p;

              return new f()

              }

          }

 5.检测属性:

    a.检测一个属性是否在一个对象中,不论是自有属性还是继承属性用 in ,如果对象包含这个属性,则返回true

       var o={x:1};

       "x" in o; ----->true

       "y" in o ------>false;

       "tostring" in o ----->false

    b.检测一个属性是否是自有属性,应使用hasOwnProperty()方法

      o.hasOwnProperty("x");------>true

      o.hasOwnProperty("y");------>false

           o.hasOwnProperty("toString")------->false

    c.检测一个属性即是自有属性还必须是可枚举的属性,应使用propertyIsEnumerable()

        var o=inherit({y:2}); //inherit方法上文提到过

        o.x=1;

        o.propertyIsEnumerable("x");---->true,x是o的可枚举自有属性

        o.propertyIsEnumerable("y"); ---->false,y是继承而来的

        Object.prototype.propertyIsEnumerable("toString");----->false,不可枚举

6.存取器属性getter和setter

  当程序查询存取器属性的值时,调用getter方法(无参数),这个方法返回的值就是属性存取表达式的值。

  当程序设置存取器属性的值时,调用setter方法,将赋值表达式右侧的值当作参数传入setter,从某种意义上讲,这个方法负责“设置”属性的值,可以忽率setter方法返回的值

7.属性的特性

      a.数据属性的特性:  1.值,2.可写性,3.可枚举,4.可配置

      b.存取器的4个特性:1.读取,2写入,3.可枚举,4.可配置

                    通过调用Object.getOwnPropertyDescriptor可获得某个对象特定属性的属性描述符;

        Object.getOwnPropertyDescriptor({x:1},“x”);---->返回{value:1,writable:true,enumberable:true,configable:true}

        Object.getOwnPropertyDescriptor({},“x”);---->返回undefined,没有这个属性 

        Object.getOwnPropertyDescriptor({},“toString”)---->返回undefined,继承属性

      要想设置属性的特性,或者想让新建的属性具有某种特性,则需要调用Object.defineProperty();

        var o={};

        Object.defineProperty(o,"x",{value:1,writeable:true,enumberable:false,configurable:true})----->添加一个不可枚举的数据属性x,并赋值为1;

        //   o.x----->1;

        // Object.keys(o);---->[];空数组,Object.keys()方法返回一个数组,这个数组有对象中可枚举的自有属性的名称组成;

        //另外还有一个方法是Object.getOwnPropertyNames(),他只返回对象的所有自有属性的名称,而不仅仅是可枚举的    


8.对象的三个属性:

      a.原型属性;

          检测一个对象是否是另一个对象的原型(或处于原型链中),应使用isPrototypeOf()方法

          var p={x:1};

          var o=Object.create(p);

          p.isPrototypeOf(o);----->true,o继承p;

          Object.Prototype.isPrototypeOf(o);true,p继承自Object.prototype

      b.类属性;

          对象的类属性是一个字符串,用以表示对象的类型信息

      c.可扩展性;

          对象的可扩展性用以表示是否可以给对象添加新属性。所有内置对象和自定义对象都是显示可扩展的。ECMAScript定义了用来查询和设置对象可扩展性的函数。通过将对象传入Object.esExtensible()来判断对象是否是可扩展。

          如果想将对象设置为不可扩展到可以调用Object.preventExtensions().将对象以参数的形式传入,如果将对象转换为不可扩展的,就无法将将其再转换为可扩展的

          Object.seal().不仅可以将对象设置为不可扩展的,还可以将对象的自有属性设置为不可配置的,其自有属性不能删除或配置,但已有可写属性依然可以设置。同样的对于那些已经封闭的(sealed)对象是不能解封的,可以使用Object.isSealed()来检测对象是否封闭。

          Object.freeze(),不仅可以将对象设置为不可扩展和属性设置为不可配置外,还可以将自有属性设置为只读。是有Object.isFrozen()来检测对象是否冻结。

9.对象的序列化

      对象的序列化是指将对象的状态转换为字符串,也可将字符串还原为对象。ECMAScript5中提供了内置函数JSON.stringify()和JSON.parse()用来序列化和还原对象。

      JSON.Stringify()用来将对象转换为字符串,JSON.parse()用来将字符串转换为对象。

posted @ 2017-06-30 16:27  锦衣夜行-绣春刀  阅读(190)  评论(0)    收藏  举报