一、对象的概念理解
先来看一个简单的对象定义代码:
var person = new Object();
person.name = "Nicholas";
person.age = 29 ;
person.job = "Software";
person.sayName = function(){
alert(this.name);
}
这其中创建了一个名为person的对象,并为他添加了三个属性。sayName()方法用来显示this.name。
ECMAScript中含有两种属性:数据属性和访问器属性
1.数据属性包含如下四个行为特性(具体功能不做详述)
【【Configurable】】;
【【Enumerable】】;
【【Writable】】;
【【Value】】;
2.访问器属性包含的特性
【【Configurable】】;
【【Enumerable】】;
【【Get】】;
【【Set】】;
3.多属性定义操作符Object.defineProperties()
4.读取属性特性操作符Object.getOwnPropertyDescription()
二、对象的创建
1.工厂模式
function createPerson (name, age, job ){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function (){
alert(this.name);
};
return o;
}
var person1 = createPerson("Nicholas",29,"Software Engineer");
var person2 = createPerson("Greg",27,"Doctor");
工厂模式解决了ECMAScript无法创建类的问题,即用函数封装以特定接口创建对象的细节。(但无法解决对象识别问题)。
2.构造函数模式
function Person (name, age, job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
}
}
var person1 = new Person("Nicholas",29,"Software Engineer");
var person2 = new Person("Greg",27,"Doctor");
与工厂模式的区别从代码上可以很明显看出两个区别:一个是this的引用,另一个是用new Person 代替了createPerson。
总的来说就是:构造函数模式没有显示地创建对象;直接将属性和方法赋给了this对象;没有return语句。
构造函数和普通函数最显著的一个区别就是对于new操作符的调用。
构造函数的缺点:
每个方法都要在每个实例上重新创建一遍。(注意,在ECMAScript中,函数即对象),所以容易导致不同的作用域链和标识符解析。此外还有一个更大的问题,那就是在全局作用域中定义的函数实际上只能被某个对象调用,这样全局作用于将变得过于狭窄。如果对象需要定义很多方法,那么就要定义很多个全局函数,那么就会丧失应用类型的封装性。(所以才会又引出另一个模式)