全面了解JavaScript对象进阶

要了解JavaScript对象,我们可以从对象创建、属性操作、对象方法这几个方面入手。概括起来,包括以下几模块:  

1.创建对象

1.1 对象直接量

对象直接量是创建对象最简单的方式,由若干名/值对组成映射表:

var point = {x: 0, y: 0 };

属性名也没有什么限制,可以是js的关键字或者任意字符串,如果是这两种情况,属性需要用双引号引起来:

var empty = {}; va point = {x: 0, y: 0 }; var book = { "main title": "Javascript", "sub-title": "The definitive Guide", "for": "all audience", author: { firstName: "Davide", lastName: "Flanagan" } };

对象直接量创建对象十分简单,但一般都不会这样使用。代码可复用性低,如果想要在其他地方使用该对象并且属性值不一样,那这么办?是不是又得重新创建一份代码?

1.2 通过new创建对象

通过new创建对象之前,先要创建一个函数,new把这个函数当做构造函数(constructor)。例如通过new创建一个Person对象:

function Person(){ //构造函数 } var person = new Person();

Javscript语言核心中的原始类型都包含内置构造函数:

var a = new Array(); var d = new Date(); var r = new RegExp(“js”);

1.3 Object.create()

在了解Object的create方法之前,我们想看看什么是原型。每一个Javascript对象(null除外)都和另一个对象相关联。“另一个”对象就是我们所说的原型。每一个对象都从原型继承属性。

所有通过对象直接量创建的对象都具有同一个原型对象Object.prototype。关键字new和构造函数创建的对象原型就是构造函数的prototype属性的值。通过new Array()创建对象的原型为Array.prototype,通过new Date()创建的对象原型为Date.prototype。原型暂介绍到这里。

Object.create方法包含两个参数,第一个参数是对象的原型,第二个参数可选,用于描述对象属性。使用很简单,只需传入所需的原型对象即可:

var o1 = Object.create({x: 1, y: 2 }); //原型为Object.prototype

如果想创建一个没有原型的对象,可通过传入null作为参数。这样创建的对象不会继承任何属性,也没有像toString这样的方法:

var o2 = Object.create(null); //没有原型

如果想创建一个普通的空对象,直接传入Object.prototype:

var o3 = Object.create(Object.prototype);

如果是自定义的对象,和创建空对象一样。直接传入对象名.prototype:

function Person(){ } var o4 = Object.create(Person.prototype);

2.属性管理

2.1 属性查询和设置

对象的属性可通过点(.)或方括号([])运算符获取。如果使用点获取属性,属性名必须是简单的表示符。不能是保留字,比如,o.for或者o.class。

ar author = book.author; //正确 var name = author.surname; //正确 var title = book[“main title”]; //正确 var className = book.class; //错误

object[“property”]这种语法看起来更像数组,只是这个数组的元素是通过字符串索引而不是数字索引。这种数组就是我们所说的关联数组,也称为散列、映射或字典。Javascript对象都是关联数组。

既然对象是关联数组,那么Javascript也为我们提供了属性的遍历方式for/in。下面的例子利用for/in计算portfolio的总计值:  

function getvalue(portfolio){ var total = 0.0; for(stock in portolio){ var shares = portolio[stock]; var price = getquote(stock); total += shares * price; } return total; }

继承:Javascript对象具有自有属性(own property),也有一些属性是从原型对象继承而来。我们先看看一个实现继承功能的函数inherit:

function inherit(p){ if (p == null) throw TypeError(); //p是一个对象,大不能是null if(Object.create){ return Object.create(p); //直接使用Object.create方法 } var t = typeof p; if(t !== "object" && t !== "function") throw TypeError(); function f() {}; f.prototype = p; //将其原型属性设置为p return new f(); }

假设要查询对象o的属性x,如果o中不存在x,将会继续在o的原型对象中查询属性x。如果原型对象中也没有x,但这个原型对象也有原型,那么继续在这个原型对象的原型上执行查询,直到找到x或者查询到一个原型为null的对象为止。

var o = {}; //o从Object.prototype继承对象属性 o.x = 1; //给o定义x属性 var p = inherit(o); //p继承o和Object.prototype p.y = 2; //p定义属性y var q = inherit(p); //q继承p、o和Object.prototype q.z = 3; //给q定义属性z var s = q.toString(); //toString继承自Object.prototype q.x + q.y // => 3:x和y分别继承自o和p

2.2 删除属性

delete运算符可以删除对象的属性:

delete book.author; delete book[“main title”];

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzsyfs.html