//原型的缺点
//构造函数
function Box(){}
//用字面量的形式添加原型
Box.prototype =
{
//指向自己
constructor : Box,
name : "Lee",
age : 100,
family : ['哥哥','姐姐','妹妹'],
run : function ()
{
return this.name + this.age + "运行中....";
}
}
//无法动态传参
var box1 = new Box();
alert(box1.name);
alert(box1.run());
alert(box1.family);
//在第一个实例修改后引用类型,保持了共享
box1.family.push("弟弟");
alert(box1.family);;
//共享了box1添加后的引用类型的原型
var box2 = new Box()
alert(box2.family);
//组合构造函数+原型模式 解决以上问题
//保持独立的用构造函数
function Box(name ,age)
{
this.name = name;
this.age = age;
this.family = ["哥哥","姐姐","妹妹"];
}
//保持共享的用原型
Box.prototype =
{
constructor : Box,
run : function()
{
return this.name + this.age + "运行中...";
}
}
//保持了独立
var box1 = new Box("Lee",100);
alert(box1.run());
alert(box1.family);
box1.family.push("弟弟");
alert(box1.family);
var box2 = new Box("Jack",200);
alert(box2.run());
//引用类型没有使用原型,所以没有共享
alert(box2.family);
//动态原型模式(将构造函数和原型模式封装在一起)
//可以将原型封装到构造函数里
function Box(name ,age)
{
this.name = name;
this.age = age;
this.family = ["哥哥","姐姐","妹妹"];
//判断this.run是否存在
//if(typeof this.run != "function")
{
//没有字面量方式直接指向自身
Box.prototype.run = function()
{
//this指针代表当前对象实例
//this.name 指代的是当前对象的实例变量或原型变量
//当box1调用该函数的时候指代box1
//当box2调用该函数的时候指代box2
return this.name + this.age + "运行中";
};
}
}
//原型的初始化,只要第一次初始化,就可以了,
//没必要每次构造函数实例化的时候都初始化
var box1 = new Box("Lee",100);
alert(box1.run());
var box2 = new Box("Jack",200);
alert(box2.run());
//寄生构造函数(工厂模式+构造函数)
function Box(name,age)
{
var obj = new Object();
obj.name = name ;
obj.age = age ;
obj.run = function()
{
return this.name + this.age + "运行中";
};
return obj;
}
var box1 = new Box("Lee",100);
alert(box1.run());
var box2 = new Box("Jack",200);
alert(box2.run());
//稳妥构造函数
//构造函数里不使用this.
//外部实例化构造函数不使用new
function Box(name,age)
{
var obj = new Object();
obj.name = name;
obj.age = age;
obj.run = function()
{
return obj.name + obj.age + "运行中..."
}
return obj;
}
var box1 = Box("Lee",100);
alert(box1.run());
var box2 = Box("Jack",200);
alert(box2.run());