方法一:工厂模式
所谓工厂模式,简单点儿说就是按照工厂生产的过程创建对象,原材料->加工->返还产品
1 function createPerson(name,age,job) 2 { 3//送入原材料 4var o = new Object(); 5//加工 6o.name = name; 7o.age = age; 8o.job = job; 9o.sayName = function(){10 alert(this.name);11}12//出厂13return o ;14 }15 16 var person1 = createPerson("Nicole",12,"software engnieer");17 var person2 = createPerson("Join",15,"writer");
优点很明显,解决了创建多个具有相似属性和方法的对象的问题,但是却没有解决对象识别的问题
比方说:
alert(person1 instance of Object);//truealert(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);//truealert(person1 instanceof Person);//true
为什么可以这样呢,因为你用Person实例化的对象,它都保存了一个constructor属性,指向Person。
alert(person1.constructor == Person);//truealert(person2.constructor == Person);//true
缺点:首先,我们看一段代码:
this.sayName = function(){}this.sayName = new Function("");
这两段代码在逻辑上是等价的,也就是说在ECMAscript中,函数是对象,每定义一个函数,就会实例化一个对象,因此,不同实例的不同函数是不相等的,用构造函数模式创建的对象,虽然看起来是大家“共用”了一个功能函数,但其实它们都是不同的对象,这就很没有必要。