日期:2014-05-16  浏览次数:20482 次

请问通过类方法的原型号方法扩充函数有什么不同?
People类使用了两种方法扩充People.Run和People.prototype.IntroduceChinese,请问这两种方法有什么不同?
各有什么优缺点


function People(name)
{
  this.name=name;
  //对象方法
  this.Introduce=function(){
  alert("My name is "+this.name);
  }
}

//类方法
People.Run=function(){
  alert("I can run");
}


//原型方法
People.prototype.IntroduceChinese=function(){
  alert("我的名字是"+this.name);
}

//测试
var p1=new People("Windking");
p1.Introduce();
People.Run();
p1.IntroduceChinese();


------解决方案--------------------
prototype对象是实现面向对象的一个重要机制。
每个函数就是一个对象(Function),函数对象都有一个子对象 prototype对象,类是以函数的形式来定义的。prototype表示该函数的原型,也表示一个类的成员的集合。
在通过new创建一个类的实例对象的时候,prototype对象的成员都成为实例化对象的成员。
1、该对象被类所引用,只有函数对象才可引用;
2、在new实例化后,其成员被实例化,实例对象方可调用。
同时,函数是一个对象,函数对象若直接声明成员,不用被实例化即可调用。 

其实总结下意思就是加了prototype的对象是不会被实例化的,是一个静态的方法
不加prototype每次new类的时候都会被实例化.占内存了.关键就是占内存了...
------解决方案--------------------
探讨

//类方法
People.Run=function(){
alert("I can run");
}

这种方法也没有实例化,与People.prototype.IntroduceChinese有区别吗?

------解决方案--------------------
People.Run=function(){
alert("I can run");
}

这个两种理解:
1,由于JS的弱类型,People也可以看做一个对象,这句给对象People添加了方法Fun
2,等效理解,给People类添加了静态方法Run