# 面向对象与原型
## 一、对象创建
~~~
var box={};
box.name='tianwei';
box.age='30';
box.run=function(){
return this.age+this.name+"运行中..."
}
alert(box.run());
~~~
###1. 工厂模式: 解决多个相似对象声明代码重复的问题
~~~
function createObject(name,age){
var obj=new Object();
obj.name=name;
obj.age=age;
obj.run=function(){
return this.name+this.age+"运行中...";
};
return obj;
}
var box1=createObject('田伟',100);
var box2=createObject('宝宝',1000);
alert(box1.run());
alert(box2.run());
~~~
###2. 构造函数模式:解决工厂模式下,不能确定是哪个对象创建的对象实例
a. 构造函数也是函数,但函数名第一个字母大写
b. 必须new 构造函数() ,才能实例化,第一个字母也是大写
~~~
function Box(name,age){ //创建对象 后台自动创建 new Object(),无需像工厂一样返回对象
this.age=age; //实例属性
this.name=name;
this.run=function(){ //实例方法
return this.age+this.name+"运行中..."
};
}
var box1=new Box("田伟",100);
var box2 =new Box('严慧',200);
alert(box1.run());
alert(box2.run());
//对象冒充
var o = new Object();
Box.call(o,'田伟',500);
alert(o.run());
~~~
实例属性,实例方法不会共享
删除实例属性:delete Box.name;
## 原型
每创建一个构造函数,就会自动生成一个prototype属性对象。
~~~
function Box(){}
Box.prototype.name="田伟";
Box.prototype.age=100;
Box.prototype.run=function(){
return this.name+this.age+"运行";
}
var box1=new Box(); //原型解决了对象里的函数引用地址共享
var box2=new Box();
box1.run==box2.run;
~~~
![](https://box.kancloud.cn/23be510e5f08eb174e0c83a241dbf6d1_434x379.png)
![](https://box.kancloud.cn/8965621a03fc862119a6121ad1b1fe96_659x398.png)
### 构造函数+原型组合模式,解决共享问题
~~~
function Box(name,age){ //可变常量部分
this.name=name;
this.age=age;
this.family=[3,5,6];
}
Box.prototype={ //不变的方法部分
constructor:Box,
run:function(){
return this.name+this.age+'运行中....';
}
}
var box1=new Box('tianwei',300);
alert(box1.run());
~~~
### 动态原型模式
把原型封装到对象中
~~~
function Box(name,age){ //可变常量部分
this.name=name;
this.age=age;
this.family=[3,5,6];
if(typeof this.run!=='function'){ //仅在第一次调用的时候初始化
Box.prototype=function(){
return this.name+this.age+'运行中....';
}
}
}
~~~