一、理解对象:
第一种:基于Object对象
var person = new Object();person.name = 'My Name';person.age = 18;person.getName = function(){ return this.name;
第二种:对象字面量方式(比较清楚的查找对象包含的属性及方法)
var person = { name : 'My name', age : 18, getName : function(){ return this.name; }}
JS的对象可以使用‘.’操作符动态的扩展其属性,可以使用’delete’操作符或将属性值设置为’undefined’来删除属性。如下:
person.newAtt=’new Attr’;//添加属性alert(person.newAtt);//new Attrdelete person.age;alert(person.age);//undefined(删除属性后值为undefined);
二、对象属性类型
1、数据属性:
数据属性指包含一个数据值的位置,可在该位置读取或写入值,该属性有4个供述其行为的特性:
[[configurable]]:表示能否使用delete操作符删除从而重新定义,或能否修改为访问器属性。默认为true; [[Enumberable]]:表示是否可通过for-in循环返回属性。默认true; [[Writable]]:表示是否可修改属性的值。默认true; [[Value]]:包含该属性的数据值。读取/写入都是该值。默认为undefined;如上面实例对象person中定义了name属性,其值为’My name’,对该值的修改都反正在这个位置
var person = {};Object.defineProperty(person, 'name', { configurable: false, writable: false, value: 'Jack'});alert(person.name);//Jackdelete person.name;person.name = 'lily';alert(person.name);//Jack 可以看出,delete及重置person.name的值都没有生效,这就是因为调用defineProperty函数修改了对象属性的特征;值得注意的是一旦将configurable设置为false,则无法再使用defineProperty将其修改为true(执行会报错:can't redefine non-configurable property);
2、访问器属性:
它主要包括一对getter和setter函数,在读取访问器属性时,会调用getter返回有效值;写入访问器属性时,调用setter,写入新值;该属性有以下4个特征: [[Configurable]]:是否可通过delete操作符删除重新定义属性; [[Numberable]]:是否可通过for-in循环查找该属性; [[Get]]:读取属性时调用,默认:undefined; [[Set]]:写入属性时调用,默认:undefined;
访问器属性不能直接定义,必须使用defineProperty()来定义,如下:
var person = { _age: 18};Object.defineProperty(person, 'isAdult', { get: function () { if (this._age >= 18) { return true; } else { return false; } }});alert(person.isAdult?'成年':'未成年');//成年
var person = {};Object.defineProperties(person,{ _age:{ value:19 }, isAdult:{ get: function () { if (this._age >= 18) { return true; } else { return false; } } }});alert(person.isAdult?'成年':'未成年');//成年
此外,使用Object.getOwnPropertyDescriptor()方法可以取得给定属性的特性:
var descriptor = Object.getOwnPropertyDescriptor(person,'_age');alert(descriptor.value);//19 对于数据属性,可以取得:configurable,enumberable,writable和value; 对于访问器属性,可以取得:configurable,enumberable,get和set
三、创建对象
使用Object构造函数或对象字面量都可以创建对象,但缺点是创建多个对象时,会产生大量的重复代码,因此下面介绍可解决这个问题的创建对象的方法
1、工厂模式
function createPerson(name, age, job) { var o = new Object(); o.name = name; o.age = age; o.job = job; o.getName = function () { return this.name; } return o;//使用return返回生成的对象实例}var person = createPerson('Jack', 19, 'SoftWare Engineer'); 创建对象交给一个工厂方法来实现,可以传递参数,但主要缺点是无法识别对象类型,因为创建对象都是使用Object的原生构造函数来完成的。
2、构造函数模式
function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.getName = function () { return this.name; }}var person1 = new Person('Jack', 19, 'SoftWare Engineer');var person2 = new Person('Liye', 23, 'Mechanical Engineer');
使用自定义的构造函数(与普通函数一样,只是用它来创建对象),定义对象类型(如:Person)的属性和方法。它与工厂方法区别在于: