js 对象(Object)

一.对象

除了字符串、数字、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])

}

原文地址:https://www.cnblogs.com/sugar-tomato/p/3654461.html