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('lucy',26,'singer');
var person2 = createPerson('Alien',20,'dance');

在使用工厂模式创建对象的时候,我们都可以注意到,在createPerson函数中,返回的是一个对象。


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('lucy',26,'singer');
var person2 = new Person('Alien',20,'dance');
console.log(person1);

对比工厂模式,我们可以发现以下区别:

1.没有显示地创建对象

2.直接将属性和方法赋给了this对象

3.没有return语句

4.终于可以识别的对象的类型。对于检测对象类型,我们应该使用instanceof操作符,我们来进行自主检测:

alert(person1 instanceof Object);//ture
alert(person1 instanceof Person);//ture
alert(person2 instanceof Object);//ture
alert(person2 instanceof Object);//ture

同时我们也应该明白,按照惯例,构造函数始终要应该以一个大写字母开头,而非构造函数则应该以一个小写字母开头。

那么构造函数确实挺好用的,但是它也有它的缺点:

就是每个方法都要在每个实例上重新创建一遍,方法指的就是我们在对象里面定义的函数。如果方法的数量很多,就会占用很多不必要的内存。

3.原型模式

function Person(){}
Person.prototype.name = 'lucy';
Person.prototype.age = 26;
Person.prototype.jbo = 'singer';
Person.prototype.sayName = function(){
alert(this.name);
};
var person1 = new Person();

使用原型创建对象的方式,可以让所有对象实例共享它所包含的属性和方法

如果是使用原型创建对象模式,请看下面代码:

function Person(){}
Person.prototype.name = 'lucy';
Person.prototype.age = 26;
Person.prototype.jbo = 'singer';
Person.prototype.sayName = function(){
alert(this.name);
};
var person1 = new Person();
var person2 = new Person();
person1.name ='Alien';
alert(person1.name);

4.混合构造函数和原型模式

function Person(name,age,job){
this.name =name;
this.age = age;
this.job = job;
}
Person.prototype = {
constructor:Person,
sayName: function(){
alert(this.name);
}
}
var person1 = new Person('lucy',26,'singer');
console.log(person1);

5.动态原型模式

function Car(name,price){
this.name=name;
this.price=price;
if(typeof Car.sell=="undefined"){
Car.prototype.sell=function(){
alert("我是"+this.name+",我现在买"+this.price+"万元");
}
Car.sell=true;
}
}
var camry =new Car("凯美瑞",27);
console.log(camry.sell());

 


function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;

if(typeof this.sayName!="function"){
Person.prototype.sayName=function(){
alert(this.name);
};
}
}

6.寄生构造函数模式

function SpecialArray(){
var array = new Array();
array.push.apply(array,arguments);
array.toPipedString = function(){
return this.join("|");
};
return array;
}
var colors = new SpecialArray("red","green","pink");
alert(colors.toPipedString());// red|green|pink
alert(colors instanceof SpecialArray); // false

7.稳妥构造函数模式


function Person(name,age,gender){
var obj = new Object();
obj.sayName = function(){
alert(name);
};
return obj;
}
var person = Person("Stan",0000,"male"); // 这里没有使用new操作符
person.sayName(); // Stan
alert(person instanceof Person); // false

posted on 2018-03-07 23:11  缥缥缈  阅读(120)  评论(0编辑  收藏  举报