javascript 中的对象

对象是javascript的基本数据类型。对象是一种复合值:它有很多值(原始值 或则其他对象)聚合在一起,可通过名字来访问这些值。对象也可以看做是属性的无序集合,每个属性都是一个名值对。属性名是字符串,因此我们可以吧对象看成是字符串到值的映射。然而对象不仅仅是字符串到值的映射,除了保持自有属性javascript还可以从一个称为原型的对象继承属性,对象的方法通常是通过继承的属性  。  这种原型式继承是javascript的核心特征。

javascript中的对象是动态的(可以新增属性也可以删除属性)但他们常用来模拟静态对象以及静态语言中的结构体,有时也用作字符串的集合

除了字符串,数字,true,false,null,undefined,之外javascript中的值都是对象   但是尽管字符串,数字和布尔值不是对象但他们和不可变的对象非常类似

对象是可变的,他们通过应用而非值来操作对象,如果变量X是指向一个值的引用,那么执行代码 var y =x;变量y也是指向同一个的对象的引用,而非这个对象的副本。通过变量y来修改这个对象也会对变量x造成影响

对象的常用的方法是  创建(create)  设置(set)   查找(query)   删除(delete)   检测(test) 和枚举(enumeration)它的属性

对象的属性包括名字和值,属性名可以是包含空字符串在内的任意字符串,但对象中不能存在两个同名的属性。

对象的属相特性

    可写     :表示可以设置该属性的值

    可枚举  :表明是否可以通过  for/in循环返回该属性

    可配置 :表明是否可以删除和修改该属性

对象的对象特性

    对象的原型(prototype)指向另外的一个对象,本对象的属性继承自它的原型对象

    对象的类(class) 是一个标识对象类型的字符串

    对象的扩展标记(extensible flag)指明了是否可以向该对象添加新属性

 

三类对象和两类属性的区分

    内置对象(native object)是由ECMAscript规范定义的对象或类  例于:数组,函数,日期,和正则表达式都是内置对象

    宿主对象(host object)是由javascript解释器所嵌入的宿主环境,客户端javascript中表示网页结构的HTMLElement对象均是数组对象

    自定义对象(user-defined object)是由运行在javascript 代码创建的对象

    自有属相(own property)是直接在对象中定义的属性

    继承属性(inherit property)是在对象的原型对象中定义的属性

创建对象

  对象直接量创建对象

  创建对象最简单的方法就是在javascript 代码中使用直接量。对象直接量是由若干名值对组成的映射表。对象直接量是一个表达式,这个表达式的每次运算都创建并初始化一个新的对象。每次计算对象直接量时候,也都会计算他它的每个属性的值,也就是说,如果在一个重复调用的的函数中的循环中的循环体内使用了直接量,他将创建很多新对象,并且每次创建的对象的属性值也可能不同

  

var empty={};               //没有任何属性的对象
var point = {x:0,y:0}    //两个属性
var point2={x:point.x , y:poimt.y+1}

 

  通过new创建对象

          new运算符创建并初始化一个新对象,关键字new后跟随一个函数调用,这里的函数称做构造函数,构造函数用以初始化一个新创建的对象,javascript语言核心中的原始类型包含内置的构造函数

var a = new Object();             //创建一个空对象
var b = Array();                    //创建一个空数组

  Object.create()

  ECMAscript 5 定义了一个名为Object.create()的方法,它创建一个新对象,其中第一个参数就是对象的原型,Object.create()提供第二个可选参数,用以对该对象的属性进行进一步的描述

object.create()是一个静态函数,而不是提供给某个对象调用方法,使用它的方法很简单,只需传入所需的原型对象即可

var o1 = object.create({ x:1,y:2 })     //o1继承了属性x 和 y

可以通过传入参数 null 来创建一个没有原型的新对象,但是通过这种方法创建的对象不会继承任何东西。甚至不包括基础方法,比如说toString()

如果想要创建一个普通的空对象(比如说通过  { }  或 new  Object() 创建的对象)则需要传入Object,prototype;

var   o3 = object.create( Object.prototype );     //o3和new Object()创建的对象一样;

 

可以通过任意原型创建新对象(换句话说,可以使用任意对象可继承 ) 这是一个非常强大的特性

//inherit() 返回一个继承自原型对象p的属性的新属性
//这里使用了ECMAscript 5中object.create()函数
//如果不存在object.create()方法则退化使用其他方法

function inherit(p){
      if(p==nullthrow TypeError();//p是一个对象,但不能是null
         if( Object.create)                   //如果object.create()存在
                 return Object.create(p);//直接使用
         var t = typeof p;                   //否则进一步检测
        if ( t !=="object" && t !== "function") throw TypeError();
        function f(){};                      //定义一个空的构造函数
        f.prototype = p;                   //将其原型属性设置为P
        return new f();                    //使用f()创建P的继承对象
    
}        

inherit()函数的其中一个用途就是防止库函数无意间(非恶意)修改那些不受你控制的对象。不是将对象直接作为参数传入函数。当函数读取继承对象属性时,实际上读取的是继承来的值,如果给继承对象的属性赋值,则这些属性智慧影响这个继承对象自身,而不是原始对象。

 

 

对象原型

每一个javascript对象(null 除外) 都和另一个对象相关联,其中另一个对象就是我们所熟知的原型,每一个对象都从原型继承属性

1   所有通过对象直接量创建的对象都具有同一个原型对象,并可以通过javascript代码Object.prototype获得对象原型的引用

2   通过关键字new和构造函数调用创建对象的原型就是构造函数的prototype属性的值

没有原型的对象为数不多,object.prototype就是其中之一,他不继承任何属性。其它的原型对象都是普通对象,普通对象都具有原型。

 

posted @ 2018-01-02 10:10  peter-钱  阅读(72)  评论(0编辑  收藏  举报