您的位置:首页 > Web前端 > JavaScript

深入学习JavaScript对象(转+学)

2015-12-13 21:43 609 查看

JavaScript对象概述

JavaScript中对象可以分成三类:

1. 内置对象,例如数组、函数、日期等;

2. 宿主对象,即JavaScript解释器所嵌入的宿主环境(比如浏览器)定义的,例如HTMLElement等;

3. 自定义对象,即程序员用代码定义的;

对象的属性可以分成两类:

1. 自有属性(own property):直接在对象中定义的属性;

2. 继承属性(inherited property):在对象的原型对象中定义的属性(关于原型对象下面会详谈)。

原型对象

Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象。但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类)。


面向对象的编程语言JavaScript,没有类,但是它可以通过原型对象实现继承,基本上每一个JavaScript对象(null除外)都和另一个对象相关联,“另一个”对象就是所谓的原型对象(原型对象也可以简称为原型,并没有想象的那么复杂,它也只是一个对象而已)。每一个对象都从原型对象继承属性,并且一个对象的prototype属性的值(这个属性在对象创建时默认自动生成,并不需要显示的自定义)就是这个对象的原型对象,即obj.prototype就是对象obj的原型对象。

在JavaScript中又这样的规定:

1. 所有通过对象直接量创建的对象的原型对象就是Object.prototype对象;

2. 通过关键字new和构造函数创建的对象的原型对象就是构造函数prototype属性的值,所以通过构造函数Object创建的对象的原型就是Object.prototype了。

对象的创建

对象直接量

对象直接量由若干名/值对组成的映射表,名/值对中间用冒号分隔,名/值对之间用逗号分隔,整个映射表用花括号括起来。属性名可以是JavaScript标识符也可以是字符串直接量,也就是说下面两种创建对象obj的写法是完全一样的:

var obj = {x: 1, y: 2};
var obj = {'x': 1, 'y':2};


通过new创建对象

new运算符后跟随一个函数调用,即构造函数,创建并初始化一个新对象。例如:

var o = new Object();    //创建一个空对象,和{}一样
var a = new Array();    //创建一个空数组,和[]一样
var d = new Date();    //创建一个表示当前时间的Date对象


Object.create()

ECMAScript5定义了一个名为Object.create()的方法,它创建一个新对象,其中第一个参数是这个对象的原型对象,第二个可选参数用以对对象的属性进行进一步的描述,第二个参数下面再说。这个方法使用很简单:

var o1 = Object.create({x: 1, y: 2});    //对象o1继承了属性x和y
var o2 = Object.create(null);    //对象o2没有原型


下面三种创建对象其实是完全一样的效果:

var obj1 = {};
var obj2 = new Object();
var obj3 = Object.create(Object.prototype);


属性的查询和设置

可以通过点(.)或方括号([])运算符来获取和设置属性的值。对于点(.)来说,右侧必须是一个以属性名命名的标识符(注意:JavaScript语言的标识符有自己的合法规则,并不同于带引号的字符串);对于方括号([])来说,方括号内必须是一个字符串表达式(字符串变量当然也可以,其他可以转换成字符串的值比如数字什么的也是都可以),这个字符串就是属性的名字。正如下面例子:

var obj = {x: 1, y: 2};
obj.x = 5;
obj['y'] = 6


概述中说过,JavaScript对象具有”自有属性“,也有“继承属性”。当查询对象obj的属性x时,首先会查找对象obj自有属性中是否有x,如果没有,就会查找对象obj的原型对象obj.prototype是否有属性x,如果没有,就会进而查找对象obj.prototype的原型对象obj.prototype.prototype是否有属性x,就这样直到找到x或者查找到的原型对象是undefined的对象为止。可以看到,一个对象上面继承了很多原型对象,这些原型对象就构成了一个”链“,这也就是我们平时所说的“原型链”,这种继承也就是JavaScript中“原型式继承”(prototypal inheritance)

对象o查询某一属性时正如上面所说会沿着原型链一步步查找,但是其设置某一属性的值时,只会修改自有属性(如果对象没有这个属性,那就会添加这个属性并赋值),并不会修改原型链上其他对象的属性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: