- 工厂模式
发明一种函数,用函数来封装以特定接口创建对象的细节。
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;
}
- 构造函数模式
function createPerson(name,age,job) {
this.name=name;
this.age=age;
this.job=job;
this.sayName=function(){
alert(this.name)
}
}
不同之处:没有显式创建对象
直接将属性和方法赋给this对象
没有return语句
使用new操作符,会经历四个步骤
1.创建已给新对象
2.将构造函数的作用域赋值给新对象
3.执行构造函数中的代码
4.返回新对象
var new1 = function(fun){
var newObj = Object.create(fun.prototype);
var returnObj = fun.call(newObj);
if(typeof returnObj === 'object'){
return returnObj
}else{
return newObj
}
}
- 原型模式
创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象。
function Person(){
}
Person.prototype.name='FBB';
Person.prototype.age=12;
Person.prototype.job='Student';
Person.prototype.sayName=function(){
alert(this.name)
}
Person.prototype.constructor==Person
使用hasOwnProperty()方法来判断什么时候访问实例属性,什么时候访问原型属性。
但是原型中所有的属性都是共享的,这种共享适合函数,不太适合包含引用类型值的属性。
- 组合使用构造函数模式和原型模式
构造函数模式用于定义实例属性,原型模式用于定义方法和共享属性。
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.friends=['TQQ','LWZ'];
}
Person.prototype={
constructor:Person,
sayName:function(){
alert(this.name)
}
}
实例属性都是在构造函数中定义的,而所有的实例共享属性都在原型中定义。
网友评论