盒子
盒子
文章目录
  1. 对象的定义
  2. 创建对象

javascript对象详解

对象的定义

对象是javascript的基本数据类型,对象是一种复合值:它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值。对象也可看做是属性的无序集合,每个属性都是一个名/值对。这种基本数据结构有很多种叫法,比如散列(hash)、散列表(hashtable)、字典(dictionary)、关联数组(associative array)。javascript对象的区别于其它语言中类似对象数据结构的本质特征是:javascript对象还可以从一个成为原型的对象继承属性,即“原型式继承”(prototypal inheritance)。

对象拥有三个相关的对象特性(object attribute)

  • 对象的原型(prototype):原型对象指向另外一个对象,本对象的属性继承自它的原型对象
  • 对象的类 (class):是一个标志对象类型的字符串
  • 对象的扩展标记(extensible flag):指明了是否可以向该对象添加新属性

对象的属性包含名字和值,属性名是可以包含空字符串在那的任意字符串,但对象中不能存在两个同名的属性名。属性值可以是任意javascript值,或者是一个getter或setter函数(ECMAScript 5特性)

对象的属性还有一些与之相关的值,称为“属性特性”(prototype attribute)

  • 可 写 性(wtitable attribute):表明是否可以设置该属性的值
  • 可枚举性(enumerable attribute):表明是否可以通过for/in循环反悔该属性
  • 可配置性(configurable attribute):表明是否可以删除或者修改该属性

javascript中对象有三大类:

  1. 内置对象(native object):是由ECMAScript规范定义的对象或类,例如,数组,函数,日期,正则表达式都是内置对象
  2. 宿主对象(host object):是由javascript解释器所嵌入的宿主环境(比如web浏览器)定义的。例如,表示网页结构的HTMLElement对象均是宿主对象。由于宿主环境定义的方法可以当成普通的javascript函数对象,宿主对象也可以当成内置对象。
  3. 自定义对象(user-defined object):是有运行中javascript代码创建的对象,例如var a = {} ;

对象的属性也可分为两类:

  1. 自有属性(own prototype):是直接在对象中定义的属性
  2. 继承属性(inherited prototype):是在对象的原型对象中定义的属性

创建对象

在javascript中,有三种方式可以创建对象:

  1. 对象直接量

    • 属性名可以是javascript标志符也可以是字符串直接量(包括空字符串)例如:var a = { b: 2 , '' : 3 } ;
    • 保留字用作属性名,必需用引号(ECMAScript 5中可以不用引号),例如:var a = { "for" : 4 } ;
    • 对象直接量中的最后一个属性后的逗号分隔符将被忽略(ECMAScript 5特性),而且大部分ECMAScipt 3的实现都支持忽略逗号,但是在老版本IE中会报错( 我印象中貌似ie8以及以下版本 )。例如:var a = { b : 2 , } ;
  2. 使用关键字new

    • new运算符创建并初始化一个新对象。关键字new后跟随一个函数调用。这里的函数被称为构造函数(constructor)。构造函数用以初始化一个新创建的对象。例如:var a = new Object() ;// 创建一个空对象,和{}一样
  3. Object.create()(ECMAScript 5特性)

    • 一个静态函数,用以创建一个对象,其中第一个参数是这个对象的原型,第二个可选参数,用以对对象的属性进行进一步描述。var o1 = Object.create( { x : 1 , y : 2 } ) ;// o1继承了属性x和y
    • 第一个参数若为null,则创建一个没有原型的新对象,不会继承任何东西,包括基础方法,比如toString(),所以它将不能和“+”运算符一起正常工作。
    • 创建普通空对象,var o3 = Object.create( Object.prototype ) ; // o3和{}和new Object() 一样

一些特性:

  • 所有通过对象直接量创建的对象都具有同一个原型对象,可用Object.prototype获得原型对象的引用
  • 通过关键字new创建的对象的原型就是构造函数的prototype属性的值,var a = new Array() ;// a的原型对象就是Array.prototype
  • 没有原型对象的对象为数不多,Object.prototype就没有原型对象,它不继承任何属性。其它原型对象都是普通对象,普通对象都具有原型;(null,也是没有原型对象的对象,个人理解)
  • 所有内置构造函数(以及大部分自定义的构造函数)都具有一个继承自Object.prototype的原型(即,所有内置构造函数的原型对象都继承自Object.prototype )。例如:new Date()创造的对象同时继承Date.prototype和Object.prototype,这一系列的原型对象就是所谓的“原型链”(prototype chain)

例6-1:通过原型继承创建一个新对象

1
2
3
4
5
6
7
8
9
function inherit( p ){ // 返回一个继承自原型对象p的属性的新对象
if( p == null ) throw TypeError() ; // p是一个对象,但不能为null和undefined
if( Object.create ) return Object.create( p ) ; // 如果cteate()方法存在,则使用它
var t = typeof p ; // 否则进一步检测
if( t !== "object" && t !== "function" ) throw TypeError() ; // p只能是一个对象或者函数对象
function f(){} ; // 定义一个空的构造函数
f.prototype = p ; // 将其原型属性设置为p
return new f() ; // 使用f()创建一个p的继承对象
}

inherit函数不能完全替代Object.cteate() , 它不能传入null为原型创建对象,而且不能接受可选的第二个参数

才写了两小节 未完待续

支持一下
扫一扫,支持lcoder