工厂模式中的函数中会创建一个对象,最后return这个对象,通过每次调用时传入的参数不同来解决创建多个相似对象的问题。
function creatPerson(name,age,job){
var o={};
o.name=name;
o.age=age;
o.job=job;
o.sayName=function(){
console.log(this.name);
}
return o;
}
var zhanghan=creatPerson('zh',33,'actor')
console.log(zhanghan)
2. 构造函数模式
构造函数本身也是函数,只不过是一个创建对象的函数.注意构造函数与工厂模式有些不同的地方,如下:构造函数首字母大写\没有显式地创建对象\将属性和方法赋值给了 this 对象\没有return语句
function Person(name, age) {
this.name = name;
this.age = age;
this.sayName = function() {
console.log(this.name)
};
}
var tj2 = new Person('tj2', 23);
console.log(tj2)
3. 原型模式
每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象,这个对象的用途是包含可以由特定类型的实例共享的属性和方法。
使用原型对象的好处是可以让所有对象实例共享他所包含的属性和方法。不必在构造函数中定义对象实例的信息,而是可以将这些信息直接添加到原型对象中。
function Person() { }
Person.prototype = {
name:'tj4',
age:25,
sayName : function() {
alert(this.name)
}
};
var tj4 = new Person();
console.log(tj4)
4. 组合使用构造函数和原型模式
构造函数模式用于定义实例属性,而原型模式定义方法和共享的属性。这种混合模式还支持向构造函数传递参数。
组合使用构造函数和原型模式
function Person(name, age, job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = function() {
alert(this.name)
}
}
Person.prototype = {
sayJob : function() {
console.log(this.job);
}
}
var person1 = new Person('tj', 22 , 'fe');
5.动态原型模式
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.friends=["小超","大超"];
if(typeof this.sayName!="function") {//这段判断语句的作用是限制Person.prototype属性(原型属性对象)只生成一次,要不然每次实例化一个Person对象都会去写一遍原型对象
Person.prototype.sayName = function () {
alert(this.name);
}
Person.prototype.sayHello=function(){
alert("Hello");
}
}
}
var person=new Person("张三",22,"coder");
person.sayName();//会弹出张三
注意:typeof this.sayName!="function" 中的this,因为创建Person构造函数时,会创建一个prototype属性,该属性实际上就是Person.prototype的原型对象,prototype属性是一个指针,指向Person.prototype的原型对象,所以构造函数拥有所有Person.prototype的原型对象的属性和方法,而创建Person.prototype圆形对象时,会生成一个constructor属性,该属性也是一个指针,指向Person构造函数,用于判断对象实例的类型!
因为Person构造函数够拥有Person.prototype的原型对象的所有属性和方法,所以可以用this判断原型中是否存在该方法!
6.寄生构造函数模式--这种模式的基本思想是创建一个函数,该函数的作用仅仅是封装创建对象的代码。
function Person(age,name) {
var o=new Object();
o.age=age;
o.name=name;
}
return o;
}
var person=new Person(22,"张三");
person.sayName();
在上面寄生模式的例子中,Person函数创建了一个新对象,并以相应的属性和方法初始化该对象,然后又返回这个对象。
然后分析其与工厂模式的区别:
1、寄生模式创建对象时使用了New关键字
2、寄生模式的外部包装函数是一个构造函数
7.稳妥构造函数与寄生构造函数模式类似,但是也有两点区别:
function Person(name,age) {
创建要返回的对象
var o=new Object();
可以在这里定义私有变量和函数
添加方法
o.sayName=function(){
alert(name);
}
//返回对象
return o;
}
var person=Person("张三",22);
person.sayName(); //使用稳妥构造函数模式只能通过其构造函数内部的方法来获取里面的属性值