对象直接量

对象直接量是由若干名/值对组成的映射表,名/值对中间用冒号分割,名/值对之间用逗号分隔,整个映射表用花括号括起来。

  • 属性名字里有空格,必须用字符串表示
  • 属性名字里有连字符,必须用字符串表示
  • 属性名是保留字,必须用字符串

原型

每一个JavaS对象(null除外)都和另一个对象关联。“另一个”对象就是我们熟知的原型,每一个对象都从原型继承属性。

所有通过对象直接量创建的对象都具有同一个原型对象,并可以通过JavaScript代码Object.prototype获得对原型对象的引用。通过关键字new和构造函数调用创建的对象的原型就是构造函数的prototype属性的值。

继承

假设要查询对象o的属性x,如果o中不存在x,那么将继续在o的原型对象中查询属性x。如果原型对象中也没有x,但这个原型对象也有原型,那么继续在这个原型对象的原型上执行查询,直到找到x或者找到一个原型是null的对象为止。

var o = {}

o.x = 1;

var p = inherit(o);

p.y = 2;

var q = inherit(p);

q.z = 3;

var s = q.toString();

q.x + q.y // 3:x和y分别继承自o和p

属性访问错误

查询一个不存在的属性并不会保持,如果在对象o自身或继承的属性中均未找到属性x,属性访问表达式o.x返回undefined。但是,如果对象不存在,那么试图查询这个不存在的对象的属性就会报错。null和undefined值都没有属性,因此查询这些值的属性会报错。

下面提供两种避免出错的方法:

  • 一种冗余但很易懂的方法

var len = undefined;

if(book){

if(book.subtitle){

len = book.subtitle.length;

}

}

  • 一种更简练的常用的方法,获取subtitle的length属性或undefined

var len = book && book.subtitle && book.subtitle.length

检测属性

JavaScript对象可以看作属性的集合,我们经常会检测集合中成员的所属关系——判断某个属性是否存在于某个对象中。可以通过in运算符、hasOwnPreperty()和propertyIsEnumerable()方法来完成这个工作,甚至仅通过属性查询也可以做到这一点。

  •  in运算符的左侧是属性名(字符串),右侧是对象。如果对象的自有属性或继承属性中包含这个属性则返回true:

var o = {x:1}

“x” in o; //true

“y” in o;//false

“toString” in o;//true

  • 对象的hasOwnProperty()方法用来检测给定的名字是对象的自由属性。对于继承属性它将返回false:

vr o = {x:1}

o.hasOwnProperty(“x”); //true

o.hasOwnProperty(“y”);//fasle

o.hasOwnProperty(“toString”); //false:toString是继承属性

  • propertyIsEnumerable()是hasOwnProperty()的增强版,只有检测到时自有属性且这个属性的可枚举性为true时它才返回true。某些内置属性是不可枚举的。通常由Javascript代码创建的属性都是可枚举的。

var o = inherit({y:2});

o.x = 1;

o.propertyIsEnumerable(“x”); //true

o.propertyIsEnumerable(“y”); //false

Object.prototype.propertyIsEnumerable(“toString”);//fasle

  • 除了使用in运算符之外,另一种更简便的方法是使用“!==”判断一个属性是否是undefined:

var o = {x:1}

o.x != undefined; //true

o.y != undefined; //false

o.toString != undefined; //true


发表评论