总结:借用W3C的例子分析
对于任意函数:属性和方法定义在函数内(外),生成的实例对象的属性和方法是独立的(共享的)
工厂函数:1.有return语句,2.属性和方法定义在函数内,生成的实例对象的属性和方法是独立的;
3. 外 共享的;
构造函数:1.有this指针替代return;存在上述2. 和 3.的情况:借鉴了2.的情况(因为this只能在函数内)
原型方式: 空函数内容;用.prototype属性生成原型链继承替代了工厂函数3.的情况
=====================推荐:原始方式混合构造函数方式======================
属性是独立的,方法是共享的;
方法是一个函数不用于存储数据设成共享没问题(属性严禁这么做),并且只占用一份的空间很划算;
混合的构造函数/原型方式联合使用构造函数和原型方式,就可像用其他程序设计语言一样创建对象。所有函数都只创建一次,而每个对象都具有自己的对象属性实例。
//即用构造函数(无.prototype属性)内部定义对象的所有非函数属性:用new 构造函数(参数,...)
生成实例的 (属性:属性名) 对应 (同属性名的变量名:变量值 )保存在栈中
function ClassFather(value1,value2,value3){
this.prototyName1=value1;
this.prototyName2=value2;
this.prototyName3=value3;
}
//用原型方式(所有的属性和属性函数(方法)有.prototype属性))构造函数外部用函数表达式定义
//对象的函数属性(方法):子对象通过原型链继承 ,
//参数(这里是实参)不能如this.prototypeName1等含有this;this必须在函数体内,不能作为参数
ClassFather.prototype.method1=function()
{
alert("ClassSon's prototype1'value is" + this.prototyName1 );
}
var ClassSon= new ClassFather("value1","value2","value3");
----控制台如下:
:=============================工厂模式=================================
function createCar(sColor,iDoors,iMpg) { var oTempCar = new Object;
oTempCar.color = sColor;
oTempCar.doors = iDoors;
oTempCar.mpg = iMpg;
oTempCar.showColor = function() {
alert(this.color);
}; return oTempCar;}
var oCar1 = createCar("red",4,23);
var oCar2 = createCar("blue",3,25);
oCar1.showColor();//输出 "red"
oCar2.showColor();//输出 "blue"
定义在工厂函数里面 所有属性,方法在子对象 ocar1,2中是不同版本,不是共享的方法;
createCar() 函数加上参数,即可为要创建的 car 对象的 color、doors 和 mpg 属性赋值。这使两个对象具有相同的属性,却有不同的属性值。
还有一行额外的代码,返回 car 对象
==============在工厂函数外定义对象的方法:子对象共享一个方法========================
function showColor() {
alert(this.color);
}function createCar(sColor,iDoors,iMpg) {
var oTempCar = new Object;
oTempCar.color = sColor;
oTempCar.doors = iDoors;
oTempCar.mpg = iMpg;
oTempCar.showColor = showColor;
return oTempCar;
}
var oCar1 = createCar("red",4,23);
var oCar2 = createCar("blue",3,25);
oCar1.showColor();//输出 "red" //点运算符方式为ocar1添加方法
oCar2.showColor();//输出 "blue"
---------------------------------------------------------
(1)方法 showColor()定义在前。在 createCar() 内部,赋予对象一个指向已经存在的 showColor() 函数的指针,解决了重复创建函数对象的问题;
(2)然后通过属性指向该方法,从而避免这个问题
========================构造函数:工厂函数的改良=======================
使用 this 关键字。使用 new 运算符构造函数时,在执行第一行代码前先创建一个对象,只有用 this 才能访问该对象。 然后可以直接赋予 this 属 性,默认情况下是构造函数的返回值(不必明确使用 return 运算符)。
就像工厂函数,构造函数会重复生成函数,为每个对象都创建独立的函数版本。
function Car(sColor,iDoors,iMpg)
{
this.color = sColor;
this.doors = iDoors;
this.mpg = iMpg;
this.showColor = function() {
alert(this.color);
};
}
var oCar1 = new Car("red",4,23);
var oCar2 = new Car("blue",3,25);
===================原型方式:借鉴工厂函数外什么方法的方式===================
工厂函数外定义方法(这样生成的对象就没有方法);再把方法,属性加到对象中(用.prototype属性造原型链,工厂外部定义模式用的是点运算符方式)1.调用 new Car() 时,原型的所有属性都被立即赋予要创建的对象,意味着所有 Car 实例对象存放的都是指向 showColor() 函数的指针。2.属于的实例都是共享Car原型函数的属性,方法
function Car() {
}
Car.prototype.color = "blue";
Car.prototype.doors = 4;
Car.prototype.mpg = 25;
Car.prototype.drivers = new Array("Mike","John");
Car.prototype.showColor = function() {
alert(this.color);
};
var oCar1 = new Car();
var oCar2 = new Car();
oCar1.drivers.push("Bill"); //共享属性,所有对象得到最新被修改值
alert(oCar1.drivers);//输出 "Mike,John,Bill"
alert(oCar2.drivers);//输出 "Mike,John,Bill"