一.对象
除了字符串、数字、true、false、null和undefined之外,javascript中的值都是对象.
javascript对象属性包括名字和值,属性名可以是包含空字符串在内的任意字符串,但对象中不能存在两个同名的属性.
属性名可以是javascript标示符也可以是字符串直接量,属性名字里用空格或者连字符"-",必须要用字符串表示.
三类javascript对象和两类属性:
- 内置对象(native object)是有ECMAScript规范定义的对象种类.例如,数组、函数、日期和正则表达式都是内置对象。
- 宿主对象(host object)是由javascript解释器所嵌入的宿主环境(比如Web浏览器)定义的.客户端javascript中表示网页结构的HTMLElement对象均是宿主对象.既然宿主环境定义的方法可以当成普通的javascript函数对象,那么宿主对象也可以当成内置对象.
- 自定义对象(user-defined object)是有运行中的javascript代码创建的对象
- 自有属性(own property)是直接在对象中定义的属性.
- 继承属性(inherited property)是在对象的原型对象中定义的属性.
原型:Object.prototype获得对原型对象的引用;例如通过new Date创建的对象的原型就是Date.prototype.(例如对Date的扩展:Date.prototype.format = function(a){...})
/**
*@Title:扩展JS内部对象的功能方法!使用prototype原型方法
*@Author:铁木箱子
*@Date:2006-10-17
*/
二.属性的查询和设置
可以通过点(.)或方括号([])运算符来获取属性的值.对于点(.)来说,右侧必须是一个属性名称命名的简单标示符.对于方括号([])来说,方括号内必须是一个计算结果为字符串的表达式,这个字符串就是属性的名字:
var author = book.author;
var name = author.surname;
var title = book["main title"];
和查询属性的写法一样,通过点和方括号也可以创建属性或给属性复制,但需要将他们放在表达式的左侧:
book.edition = 6;
book["main title"] = "ECMAScript";
三.作为关联数组的对象
javascript对象都是关联数组,也称作散列、映射或者字典
有很多场景智能使用数组写法来完成,比如说在写程序的时候不知道属性名称,属性名称是动态的,因此无法通过点运算符来访问对象属性。但可以使用[]运算符,因为它使用字符串值(字符串值是动态的可以在运行的时候更改)而不是标示符(标示符是静态的,必须写死在程序里)作为索引堆属性进行访问.object[变量]是对的,但是object.变量是错误的.
四.检测属性
javascript对象可以看做属性的集合,我们经常会检测集合中成员的所属关系——判断摸个属性是否在某个对象中。可以通过in运算符、hasOwnPreperty()和propertyIsEnumerable()方法来完成这个工作,甚至仅通过属性查询也可以做到这一点.
var o = {x:1}
"x" in o; //true: "x"是o的属性
"y" in o; //false: "y"不是o的属性
"toString" in o; //true: o继承toString属性
对象的hasOwnProperty()方法用来检测给定的名字是否是对象的*属性.对于继承属性它将返回false:
var o = {x:1}
o.hasOwnProperty("x"); //true: "x"是o的属性
o.hasOwnProperty("y"); //false: "y"不是o的属性
o.hasOwnProperty("toString"); //toString是继承的属性
propertyIsEmumerable()是hasOwnProperty()的增强版,是有检测到是自有属性且这个属性的可枚举性为true时它才返回true.
除了使用in运算符之外,另一种更简单的方法是使用"!=="判断一个属性是否是undefined:
var o = {x:1}
o.x !== undefined; //true: "x"是o的属性
o.y !== undefined; //false: "y"不是o的属性
o.toString !== undefined; //true: o继承了toString属性
然而有一种场景只能使用in运算符而不能使用上述属性访问的方式.in可以区分不存在的属性和存在的但是值为undefined的属性.
五.枚举属性
var o = {x:1,y:2,z:3}
o.propertyIsEnumerable("toString");
for(p in o){
cosole.log(o[p])
}