工厂模式
function fruit(kinds){
var o=new Object();
o.kinds=kinds;
o.sayKinds=function(){
console.log(this.kinds);
}
return o;
}
var orange=fruit('orange');
orange.sayKinds();//'orange'
工厂模式解决了创建多个相似对象的问题,但是却没有解决对象识别的问题
构造函数模式
function Shape(shape){
this.shape=shape;
this.drawShape=function(){
console.log("画一个"+this.shape);
}
}
var circle=new Shape('圆');
circle.drawShape();//'画一个圆''
构造函数和工厂模式的区别
没有显示的创建对象
直接将对象和属性赋值给了this
没有return语句
注意:构造函数始终应该以个大写字母开头
创建实例的时候使用到了new操作符,这种方式调用构造函数的过程
创建一个新的对象
将构造函数的作用域赋值给这个新对象
执行构造函数中的的代码(给这个新对象添加属性和方法)
返回这个新对象
构造函数和普通函数
任何函数通过new操作符来调用,都可以作为构造函数
而任何函数不通过new操作符调用,跟普通函数没有什么区别
构造函数的问题
每个方法都要在每个实例上重新创建一遍,函数没办法复用
原型链
function Animal(){
}
Animal.prototype.name='animal';
Animal.prototype.food='meat';
Animal.prototype.friends=['human'];
Animal.prototype.eat=function(){
console.log(this.name+' eat '+this.food);
}
Animal.prototype.sayFriends=function(){
console.log(this.friends);
}
var dog=new Animal();
dog.eat();//'animal eat meat'
dog.friends.push('duck');
var cat=new Animal();
cat.eat();//'animal eat meat'
cat.sayFriends();//["human", "duck"]
原型对象的问题
第一:省略了为构造函数传递初始化参数这一个环节,结果所有实例在默认情况下取相同的属性值
第二:原型中的所有属性都是共享的,对于值类型没有什么影响,但是对于引用类型来说,修改其中的一个实例的属性,另一个实例的属性也要被修改
组合使用构造函数和原型模式
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.friends=['didi','jiejie'];
}
Person.prototype={
constructor:Person,
sayName:function(){
console.log(this.name);
},
sayFriends:function(){
console.log(this.friends);
}
}
var p1=new Person('meimei','18','student');
p1.sayName();//'meimei'
p1.friends.push('boyfriends');
p1.sayFriends();//["didi", "jiejie", "boyfriends"]
var p2=new Person('gege','19','teacher');
p2.sayName();//'gege'
p2.sayFriends();//["didi", "jiejie"]
实例属性都在构造函数中定义,由所有实共享的属性和方法都在原型中定义
动态原型模式
function Book(name){
// 属性
this.name=name;
// 方法
if(typeof this.sayName != 'function'){
Book.prototype.sayName=function(){
console.log(this.name);
}
}
}
var book=new Book('javascript');
book.sayName();
把所有的信息封装在构造函数中,而通过在构造函数中的初始化原型(仅在必要的情况下),又保持了构造函数和原型的有点
寄生构造函数模式
基本思想:创建一个函数,该函数的作用仅仅是封装创建对象的代码,然后返回新创建的对象
function Student(kinds){
var o=new Object();
o.kinds=kinds;
o.sayKinds=function(){
console.log('I am is a '+ kinds);
}
return o;
}
var graduteStudent=new Student('graduteStudent');
graduteStudent.sayKinds();
特点
第一:返回的对象与构造函数或者与构造函数的原型属性之间没有关系
第二:构造函数返回的对象与在构造函数外部创建的对象没有什么不同,不能用instanceof操作符来确定对象类型;