深入探究JavaScript对象系列(一)
最近看了由大卫编写、淘宝前端团队翻译的《JavaScript权威指南》第六版,对于js的对象有了一个初步的认识,写这几篇文章的目的第一也是巩固下自己学习的东西,再者也希望能整理下js对象的基本语法和用法当做砖头抛出去。
一.JavaScript的整体概述
对象是JavaScript的基本数据类型,可以把JavaScript对象看成是属性的无续集合(看有点像PHP中的关联数组),每个属性都是一个键值对,除了字符串、数字、布尔值、null、undefined外,都是对象。
在JavaScript中,对象可以分成3类:
- 内置对象:即由ECMAScript规范定义的对象或类,如数组、函数、日期和正则表达式等都是内置对象;
- 宿主对象:由JavaScript解释器所嵌入的宿主环境,最常见的就是Web浏览器定义的对象;
- 自定义对象:由JavaScript代码定义的对象。
二.JavaScript对象的创建
创建对象的3种方法
- 对象直接量:创建对象最简单的方式。
var empty = {}; //创建了一个没有任何属性的对象 var point = {x:0, y:0, add: function(s,t){ return s+t;} }; //创建了一个具有两个属性和一个方法的对象 var book = { //创建了一个有属性值也为对象的对象 "title" : "JavaScript权威指南", “author" : { firstname : "David", secondname : "Flanagan" } };
- 通过关键字new创建对象:通过new运算符和一个构造函数来新建一个对象。
var o = new Object(); //创建一个空对象,和var o ={};一样 var a = new Array(); //创建一个空数组,和 var a =[];一样
- Object.create()函数:ECMAScript5中定义了这个静态方法,其中第一个参数是要创建的对象的原型对象(prototype),第二个参数可选,用于对对象的属性进行进一步的描述。(之后会对原型做进一步说明)
var o = Object.create({x : 1 , y : 2}); //o继承了属性x和属性y var o1 = Object.create(null); //创建一个没有原型的新对象 function inherit(p){ //由于ECMAScript3中没有该方法,因此可以使用该方法来模拟 if(p == null) throw TypeError(); if(Object.create) return Object.create(p); var t = typeof p; if(t !== "object" && t !== "function") throw TypeError(); function f(){}; f.prototype = p; //指定构造函数f的原型为p return new f(); }
三.原型对象(prototype)和继承
prototype是JavaScript继承的核心,所有的JavaScript对象都是通过原型对象来相互联系的。
所有通过对象直接量创建的对象都具有同一个原型对象,并可以通过Object.prototype获得对新创建对象的引用;通过关键字new和构造函数调用创建的对象的原型就是构造函数的prototype属性的值。
除了Object.prototype以外,其他所有对象都有原型,且原型对象都是普通对象,所有的JavaScript内置构造函数以及大部分自定义的构造函数都具有一个直接或间接继承自Object.prototype的原型,比如通过构造函数定义一个时间对象 var s = new Date(); 即s的原型对象就是Date.prototype,而Date.prototype又有自己的原型对象,即Object,prototype,这一系列链接的原型对象就是所谓“原型链”(prototype chain).