标签:
方法一:工厂模式
所谓工厂模式,简单点儿说就是按照工厂生产的过程创建对象,原材料->加工->返还产品
1 function createPerson(name,age,job) 2 { 3 //送入原材料 4 var o = new Object(); 5 //加工 6 o.name = name; 7 o.age = age; 8 o.job = job; 9 o.sayName = function(){ 10 alert(this.name); 11 } 12 //出厂 13 return o ; 14 } 15 16 var person1 = createPerson("Nicole",12,"software engnieer"); 17 var person2 = createPerson("Join",15,"writer");
优点很明显,解决了创建多个具有相似属性和方法的对象的问题,但是却没有解决对象识别的问题
比方说:
alert(person1 instance of Object);//true alert(person1 instance of createPerson);//false
方法二:构造函数模式
function Person(name,age,job) { this.name = name; this.age = age; this.job = job; this.sayName = function(){ alert(this.name); } } var person1 = new Person("Nicole",12,"software engnieer"); var person2 = new Person("Join",15,"writer");
从上面可以看出,构造函数模式,不在函数内部创建Object对象,而是用this代替,最后创建实例时使用new
其中:
var person1 = new Person("Nicole",12,"software engnieer");
经历了以下几个过程:
1.var o = new Object();
2.o = this(Person);
3.执行构造函数中的代码;
4.返回新对象
优点:1.使用new创建对象,更符合面向对象的创建习惯;
2.红宝书上说创建构造函数意味着将它的实例标识为一种特定的类型,我的理解是,就是创建了一种类型,你可以用它去创建实例。
alert(person1 instanceof Object);//true alert(person1 instanceof Person);//true
为什么可以这样呢,因为你用Person实例化的对象,它都保存了一个constructor属性,指向Person。
alert(person1.constructor == Person);//true alert(person2.constructor == Person);//true
缺点:首先,我们看一段代码:
this.sayName = function(){} this.sayName = new Function("");
这两段代码在逻辑上是等价的,也就是说在ECMAscript中,函数是对象,每定义一个函数,就会实例化一个对象,因此,不同实例的不同函数是不相等的,用构造函数模式创建的对象,虽然看起来是大家“共用”了一个功能函数,但其实它们都是不同的对象,这就很没有必要。
标签:
原文地址:http://www.cnblogs.com/aiying/p/5430253.html