JS:定义“类”对象的方法对比

总结:借用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");

----控制台如下:

230621_FWjt_2349223.png=============================工厂模式=================================

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"


转载于:https://my.oschina.net/Bidongming/blog/522856

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值