zoukankan      html  css  js  c++  java
  • JavaScript Object

    一、简述

    JavaScript的基础类型是Object(对象),一个对象是一个复合值,它聚合了多个值,允许你通过一个名称来存储或者检索一个值。或者说一个对象是一个无序的属性(property)的集合,每个属性包含属性名和属性值。

    属性名是一个字符串,属性值可以为任意对象,所以可以认为对象是字符串到值的映射。类似其他语言中的哈希表,字典之类的。

    但是JavaScript对象也不简简单单的是一个属性的集合,它还包括从另一个对象继承来的属性,这个被继承的对象,叫做该对象的原型(prototype)。一个对象上的方法通常是可以继承的属性。这种原型继承是JavaScript的一个非常关键的特性。

    JavaScript对象是动态的,因为它的属性可以删除也可以添加;但是他们也可以用来模拟静态类型语言中的静态对象或者结构;他们还可以用来表示字符串集合(即忽略字符串到值的映射中的值的部分)。

    JavaScript对象的属性(property),除了有名字和值外,还包含描述属性本身的属性(attribute),主要是:属性的值是否可写writable,属性是否可以被枚举enumerable(在for/in中被枚举到),属性是否可以配置configurable(删除,或者修改其属性)。

    每个JavaScript对象除了属性外,还有三个与object关联的属性attribute:

    1)prototype:一个对象的原型,是对另一个对象的引用,被引用的对象的属性被该对象继承。

    2)class:一个对象的类型,是一个表示对象所属类型的字符串。

    3)extensible:表示对象是否可以扩展的标志,即属性是否可以动态删除和增加。

    JavaScript对象可以分为本地对象(ES规范定义的:Array,Date等等),宿主对象(比如浏览器定义的),用户定义对象,对象上的属性可以分为固有属性和继承而来的属性。

    二、对象原型

    几乎每个JavaScript对象都有第二个对象(也有极少的例外:Object.prototype),这第二个对象就是对象的原型。比如Object的原型是Object.prototype,Date的原型是Date.prototype,Date原型也是对象,也有自己的原型,它的原型是Object.prototype。Object.prototype对象没有原型。所有这些原型形成了一个原型链,Object.prototype是这个链的根,其他的原型最终都继承自这个根。

    三、对象的创建

    1、对象字面量,所有的对象字面量的原型为Object.prototype; var obj={x:1,y:2};

    2、Object.create();静态函数,需要传入一个原型参数,和一个可选的属性参数;var obj=Object.create(Date.prototype);

    3、new操作符;var obj=new Date();

    四、设置和访问对象的属性

    访问对象的属性有两种方式,一是obj.propName,一是obj[expression],前者要求propName为字符串,后者要求表达式的值为字符串或者能够转换成字符串。

    设置对象的属性也是通过上面两种方式。

    需要注意的是,设置或访问一个对象的属性有时候不成功或者抛出异常:(假设设置对象o的属性p)

    1、o有一个固有的只读属性p,一般不能设置(但也有例外,如可配置的只读属性也可以设置)。

    2、o有一个继承的只读属性p,一般不能设置。

    3、null和undefined没有任何属性,所以不能设置也不能访问。否者抛出TypeError。

    4、访问一个不存在的属性,正常情况下返回undefined,设置一个不存在的属性,正常情况下是新建这个属性。

    5、删除对象上的属性,删除成功,或者删除存在没有副作用时,或者删除一个表达式(不是属性)都会返回true,表示操作成功。如:var o={x:1};delete o.x;delete o.x;delete 1;delete o.toString都返回true

    6、判断对象是否存在某个属性:in操作符,o.hasOwnProperty(name),o.p!==undefined

    五、属性可以是getter或者setter方法

    1、JavaScript属性包含一个名称,一个值和一系列attribute,在ES5中JavaScript的属性值还可以是getter或者setter方法,或者两个都是。例子:

    var obj={data_prop:value,get accessor_prop(){...},set accessor_prop(){...}}

    2、使用场合有:

      a.一个数据几种表示,如:var p={x:1,y:2;get r(){},set r(){},get theta(){}};//坐标的平面和极坐标表示。

      b.每次属性的访问都返回不同的值,如var serialNum={$n:0,get next(){return $n++;},set next(n){if(n>$n) $n=n;}};//序列数,每次返回都不一样,其中$n表示n是一个私有属性。

      c.其他:var random={get octet(){return Math.floor(Math.random()*256);},get uint16(){return Math.floor(Math.random()*65535);},get int16(){return Math.floor(Math.random()*65535)-32768;}};

    六、属性的描述属性(attribute)

    通过以上,我们知道属性的值可以是一个具体的数据,也可以是getter,setter方法,对于属性值为数据的属性,有:value,writable,enumerable,configurable四个描述属性。

    对于数据值为getter、setter方法的属性,有:get,set,enumerable,configurable四个描述属性。这些属性是通过一个属性描述符对象返回的。

    通过静态方法Object.getOwnPropertyDescriptor()可以获取一个属性的属性描述符对象,如:

    Object.getOwnPropertyDescriptor(random,"octet");返回的对象是:{configurable:true,enumerable:true,get:function}

    Object.getOwnPropertyDescriptor({x:1,y:2},"x");返回的对象是:{value:1,configurable:true,writable:true,enumerable:true}

    修改一个属性的描述属性为:Object.defineProperty(object,prop,descriptor),如:

    var o={};Object.defineProperty(o,"x",{value:1,configurable:true,wriable:true,enumerable:false});//定义了一个属性,并且设置了属性的描述属性。

    Object.defineProperty(o,"x",{writable:false}// 设置为不可写。o.x=3;//赋值失败,因为不可写。但是属性是configurable的,所以通过:Object.defineProperty(o,"x",{value:3});修改属性的值。

    还可以把值的属性修改为get,set的属性,如:Object.defineProperty(o,"x",{get:function(){return 0;}};o.x//返回0

    Object.defineProperties可以批量修改一个对象的多个属性,如:

    var o=Object.defineProperties({},{

    x:{value:1,configurable:true},

    y:{value:2,writable:true}

    });//定义了空对象,并且设置了x,y属性。

    七、对象本身的描述属性

    每个对象都有:prototype,class,extensible三个描述属性。

    Object.isExtensible()和Object.preventExtensions()用来获取一个对象是否可扩展和防止对象被扩展。一个不能扩展的对象,没有方法使其再变为可扩展。

    Object.seal(),除了有preventExtensions的功能外,它还把对象上的所有属性都设置为nonconfigrable,一个seal的对象,没有方法使其再变为unsealed,通过Object.isSealed()获取是否sealed

    Object.freeze(),除了上面两个的功能外,它还把对象上的所以属性设置为只读。通过Object.isFrozen()获取对象是否被freeze

    八、对象序列化

    通过JSON.stringify()和JSON.parse()把JS对象序列化和反序列化。

    九、 Object方法:

    toString()/toLocaleString()/toJSON()/valueOf

  • 相关阅读:
    java之内部类与匿名内部类
    学习Android之内部类
    Android横竖屏切换总结
    java实现快速排序
    Palindrome Partitioning II
    Palindrome Partitioning
    Clone Graph
    Word Break
    Gas Station
    Candy
  • 原文地址:https://www.cnblogs.com/winson/p/3341269.html
Copyright © 2011-2022 走看看