《JavaScript高级程序设计》(1)—&6.对象的创建及相关模式

来源:互联网 发布:刮眉毛会变浓吗 知乎 编辑:程序博客网 时间:2024/04/28 10:16

一、对象的概念理解
先来看一个简单的对象定义代码:

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中,函数即对象),所以容易导致不同的作用域链和标识符解析。此外还有一个更大的问题,那就是在全局作用域中定义的函数实际上只能被某个对象调用,这样全局作用于将变得过于狭窄。如果对象需要定义很多方法,那么就要定义很多个全局函数,那么就会丧失应用类型的封装性。(所以才会又引出另一个模式)

0 0