首页 > 代码库 > 《javascript语言精粹》——第3章

《javascript语言精粹》——第3章

第三章:对象:

属性名字:可以是包括空字符串在内的任意字符串;

属性值:是除undefined值之外的任何值;

【1】、对象字面量:

  var obj={}; //空对象

  var newobj={

  name:"小明",  

  age:17,

      school:{

    class:"一班"

  }

 };

属性名可加引号,也可不加

【2】、检索

  newobj["name"] //小明

  newobj.age  //17  推荐使用.可读性更加好,紧凑

  newobj["name1"]  //若检索不存在的属性,则返回undefined值

||运算符可以用来填充默认值

   var test=newobj["name"]||"none";

&&运算符来避免错误

  var test1=newobj["newname"];   //undefined

  var test2=newobj["newname"].model; //throw "type.error"

  var test3=newobj.newname&&newobj.newname.model; //undefined

【3】、更新

  newobj["newname"]="小花";

  newobj.nickname="小三";

  newobj.family={

    mother:"老妈",

    father:"老爸"

  };

  若该属性名存在于该对象中,那么就是直接复制替换,若该属性值不存在于该对象中,那么直接扩充到该对象中,成为该对象的属性!

【4】、引用

  var x=newobj;

  x.nickname="小四";

  var nick=newobj.nickname; //小四

  var a={},b={},c={};

    //引用不同的空对象

  a=b=c={};

    //引用同一个空对象

【5】、原型

  if(typeof Object.beget!=="function")
  {
    Object.beget=function(o){
    var f=function(){};
    f.prototype=o;
    return new f();
    };
  }

  var anotherObj=Object.beget(newobj);
  newobj.brother="小弟"; //对作为原型对象的对象,若更新属性或者扩充属性,都会使基于该原型创建的对象可见,

但是,对于原型链接更新是,也就是基于原型创建的对象在改变时,不会触及到原型.原型连接只有在检索值的时候才会被用到。

检索顺序是:原型对象----》原型---》Object.prototype,若想要的属性不存在原型链中,就会返回undefined,该过程称之为委托。
  alert(anotherObj.brother); //小弟

【6】、反射

  typeof操作符确定属性的类型

  newobj.hasOwnProperty("brother") ;//true,因为brother是newobj对象中独有的属性

  newobj.hasOwnProperty("constructor");//false,因为constructor不是newobj对象中的独有的属性,别的对象也都有constructor

【7】、枚举

  var name;
  for(name in anotherObj){ //声明的name变量,用来临时装对象中的所有属性
    if(typeof anotherObj[name]!=="function"){
      document.writeln(name+":"+anotherObj[name]); //运行出来的顺序是不确定的
    }
  }

  var i;
  var prop=[
    "name",
    "nickname",
    "age",
    "brother"
  ];
  for(i=0;i<prop.length;i++)
  {
    document.writeln(prop[i]+":"+anotherObj[prop[i]]);//name:小明 nickname:小三 age:17 brother:小弟
  }

【8】、删除

 

  delete anotherObj.name;

  alert(anotherObj.name); //小明,不会删除原型链中的任何对象

  delete newobj.name;

  alert(newobj.name);//undefined

  delete newobj.name;

  alert(anotherObj.name);//undefined