1.工厂模式
例子:
function createPerson(name,age){
var o = new Object();
o.name = name;
o.age = age;
o.sayName = function () {
alert(this.name);
}
return o;
}
var person1 = createPerson("EvanChen",18,"Software Engineer");//创建一个对象
问题:没有解决对象识别问题
alert(person1 instanceof createPerson)//fasle 会发现其实并不存在一个createPerson类
2.构造函数模式
例子:
function Person(name,age){
this.name = name;
this.age = age;
this.sayName = function(){
alert(this.name);
}
}
var p1 = new Person('EvanChen',18);//创建一个Person类
用new操作符调用构造函数经历了以下4个步骤:
(1)创建一个新对象
(2)将构造函数的作用域赋给新对象
(3)执行构造函数中的代码
(4)返回新对象
解决了工厂模式兑现识别问题:
alert(typeof(p1));// Person
alert(p1 instanceof(Person));// true
3.原型模式
例子:
function Person(){
}
Person.prototype.name = "EvanChen";
Person.prototype.age= 18;
Person.prototype.sayName= function(){
alert(this.name);
}
var p1 = new Person();
p1.sayName(); //"EvanChen"
var p2 = new Person();
p2.sayName(); //"EvanChen"
alert(p1.sayName == p2.sayName); //true
将所有属性和方法都加在Person的prototype属性中,因此新对象具有相同的属性和方法。
4.组合使用构造函数模式和原型模式(推荐)
例子:
function Person(name,age){
this.name = name;
this.age = age;
this.friends = ["Shelby","Court"];
};
Person.prototype = {
constructor:Person,
sayName:function(){
alert(this,name);
}
}
//Person.prototype.sayName = function(){
// return this.name;
//};
var person1 = new Person("EvanChen",18);
var person2 = new Person("Greg",16);
person1.friends.push("Van");
alert(person1.friends);//"Shelby,Court,Van"
alert(person2.friends);//"Shelby,Court"
alert(person1.friends == person2.friends);//false
alert(person1.sayName == person2.sayName );//true
所有实例共享原型中的属性constructor和方法sayName(),相同的属性在构造函数中定义。
5.动态原型模式(推荐)
例子:
function Person(name,age){
this.name = name;
this.age = age;
if (typeof this.sayName != "function"){
Person.prototype.sayName = function(){
alert(this.name);
};
}
};
var person1 = new Person("EvanChen",18);
person1.sayName();
在sayName()方法不存在的情况下,才会将它添加到原型中,当原型完成初始化后,能够立即在所有实例中得到共享。
6.寄生构造函数模式
基本思想是:创建一个函数,该函数的作用仅仅是封装对象的代码,然后再返回新构建函数的对象
例子:
function SpecialArray(){
var values = new Array();//创建数组
values.push.apply(values,arguments);//添加值
values.toPipedString = function () {
return this.join("|");
}//添加方法
return values//返回数组
}
var colors = new SpecialArray("red","blue","green");
alert(colors.toPipedString());//red|blue|green
构造函数返回的对象与构造函数外部创建的对象没有什么不同,因此不能依赖instanceof操作符来确定对象类型。
7.稳妥构造函数模式
稳妥对象指的是没有公共属性,而且其方法也不再引用this的对象。稳妥对象最适合在一些安全的环境中,或者防止数据被其他应用程序删改时使用。
例子:
function Person(name, age) {
//创建要返回的对象
var o = new Object();
//定义私有变量和函数
o.sayName = function (){
alert(name);
}
return o;
}
var person1 = Person("EvanChen", 18);
person1.sayName();//"EvanChen"
在这种模式创建的对象中,除了使用sayName()方法外,没有其他方法访问name的值。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。