最近在读javascript高级程序设计,其中的对象基础一章感觉讲的很好,下面把其中有用的东西分享一下。

看如下JavaScript构造类的一个示例:

JavaScript代码

  1. function Car(sColor, iDoors, iMpg) {
  2. this.color = sColor;
  3. this.doors = iDoors;
  4. this.mpg = iMpg;
  5. this.showColor = function() {
  6. alert(this.color);
  7. }
  8. }
  9. var oCar1 = new Car(‘red’, 4, 23);
  10. var oCar2 = new Car(‘blue’, 3, 25);

这种方法被称为构造函数方式 。简要的说明一下,这段代码声明了一个Car类,oCar1和oCar2为其两个对象。看起来这段代码很是不错,但是注意那个this.showColor = function(){alert(this.color)};

this指代Car的一个对象,也就是说,每一个对象都有一个showColor方法,这势必会造成一种资源浪费。

再来看一种JavaScript构造类的示例:

JavaScript代码

  1. function Car(){
  2. }
  3. Car.prototype.color = “red”;
  4. Car.prototype.doors = 4;
  5. Car.prototype.mpg = 23;
  6. Car.prototype.showColor = function(){
  7. alert(this.color);
  8. }
  9. var oCar1 = new Car();
  10. var oCar2 = new Car();

这种方法被称为原型方式 。该方法避免了showColor函数被每个对象都创建,而是所有Car类的对象共享这一个函数,然后在调用的时候,使用this关键字找到实例对象的 color,这种方式也有问题,即color,doors和mpg被所有对象共享,如果一个对象修改了color那么其他的对象的color也会相应的改 变。

那么显然将二者结合起来就好了:

JavaScript代码

  1. function Car(){
  2. this.color = sColor;
  3. this.doors = iDoors;
  4. this.mpg = iMpg;
  5. }
  6. Car.prototype.showColor = function(){
  7. alert(this.color);
  8. }
  9. var oCar1 = new Car();
  10. var oCar2 = new Car();

这种方式被称为混合的构造函数/原型方法

这个代码就没有什么问题了,那么动态原型方法 指的是什么呢?

我们先来看一段java代码:

Java代码

  1. class Car {
  2. public String color = “red”;
  3. public int doors = 4;
  4. public int mpg = 23;
  5. public Car(String color, int doors, int mpg){
  6. this.color = color;
  7. this.doors = doors;
  8. this.mpg = mpg;
  9. }
  10. public void showColor() {
  11. System.out.println(this.color);
  12. }
  13. }

这是和我们前面JavaScript构造出来的相似的一个java class.由此可见由于java超强的面向对象的机制,已经把这种属性和方法的区别为我们做好了,我们只需要将所有的方法写在class中,然后java处理好剩下的事情。

JavaScript也有一种几乎完全和这段java类似的方法-动态原型方法

JavaScript代码

  1. function Car(sColor,iDoors,iMpg){
  2. this.color = sColor;
  3. this.doors = iDoors;
  4. this.mpg = iMpg;
  5. if(typeof Car._initialized == “undefined”){
  6. Car.prototype.showColor = function(){
  7. alert(this.color);
  8. }
  9. Car._initialized = true.
  10. }
  11. }

这回看起来舒服多了吧,不过动态原型方法 在继承的时候有一个问题:

JavaScript代码

  1. function Polygon(iSides) {
  2. this.sides = iSides;
  3. if(typeof Polygon._initialized == “undefined”){
  4. Polygon.prototype.getArea = function(){
  5. return 0;
  6. }
  7. Polygon._initialized = true;
  8. }
  9. }
  10. function Triangle(iBase,iHeight){
  11. Polygon.call(this,3);
  12. this.base = iBase;
  13. this.height = iHeight;
  14. if(typeof Triangle._initialized == “undefined”){
  15. Triangle.prototype = new Polygon();
  16. Triangle.prototype.getArea = function(){
  17. return .5 * this.base * this.height;
  18. }
  19. Triangle._initialized = true;
  20. }
  21. }
  22. var tri1 = new Triangle(3,4);
  23. alert(tri1.getArea());

这段代码根本就跑不起来,也就是说当

JavaScript代码

  1. var tri1 = new Triangle(3,4);

执行的时候,程序会进入Triangle的构造函数中,然后依次执行,此时Triangle的这个对象已经被实例化了,所以当再次调用

JavaScript代码

  1. <strong>Triangle.prototype = new Polygon();</strong>

自然就会报错了。也就是说,动态原型方法 不适合与继承中子类的构造。

那么修改一下就可以了:

JavaScript代码

  1. function Polygon(iSides) {
  2. this.sides = iSides;
  3. this.type = “Polygon”;
  4. if(typeof Polygon._initialized == “undefined”){
  5. Polygon.prototype.getArea = function(){
  6. return 0;
  7. }
  8. Polygon._initialized = true;
  9. }
  10. }
  11. function Triangle(iBase,iHeight){
  12. Polygon.call(this,3);
  13. this.base = iBase;
  14. this.height = iHeight;
  15. if(typeof Triangle._initialized == “undefined”){
  16. Triangle.prototype.getArea = function(){
  17. return .5 * this.base * this.height;
  18. }
  19. Triangle._initialized = true;
  20. }
  21. }
  22. Triangle.prototype = new Polygon();
  23. var tri1 = new Triangle(3,4);
  24. alert(tri1.getArea());
  25. alert(tri1.type);

总之,JavaScript面向对象是JavaScript重要的一关,也是JavaScript高级的重要部分,所以语法特性不是一个语言最重要的部分,而模式,设计,OO这些东西才是学好一门 语言的关键。可以看看ext的东西,尤其是源代码(我目前是没看懂),你就会发现,ext使用类似swing的模式,使用JavaScript这种语言搭建了一个如此庞大的对象的库是多么的强大了。

转载请标注编辑来源:JavaScript面向对象 – 动态原型方法

网络来源:http://prothiphoebe.javaeye.com/blog/411503   我想网 板凳 编辑

Tags: ,

分享
QQ书签
百度搜藏
Del.icio.us
Google书签
和讯网摘
天极网摘

回复已关闭.