2012-07-24 75 views

回答

1

第二個鏈接是描述原型,一個構建JavaScript應用程序的框架;這是一個合適的名字。 (有點像命名窗口系統「Windows」,以隨機選擇一個例子。)第一個鏈接中使用的「prototype」這個詞是JavaScript內部工作的標準術語。該框架以原型概念命名。

JavaScript中的「prototypes」概念有很好的介紹,文章號碼爲this link

2

沒有區別。 Prototype JS只是一個使JavaScript更容易工作的框架。這兩種情況下的屬性prototype都屬於被用作構造函數的函數,它們只是JavaScript。

如果您想了解更多關於JavaScript中的繼承問題,請閱讀以下answer。我個人不喜歡使用任何框架。我使用的唯一框架是Vapor.js。然而,隨着類時我通常利用以下gist的:

var Class = function() { 
    var slice = Array.prototype.slice; 
    var bind = Function.prototype.bind; 

    var prototype = Class.prototype = new Function; 
    return prototype.constructor = Class; 

    function Class(definition, base) { 
     var klass = function() { 
      var instance = this; 

      if (base instanceof Class) 

      var uber = function() { 
       if (uber instanceof base) return uber; 

       arguments = slice.call(arguments); 
       arguments = [null].concat(arguments); 
       uber = bind.apply(base, arguments); 
       uber = new uber; 

       var hyper = instance.__proto__ = uber; 
       var proto = hyper.__proto__; 

       while (proto != parent) { 
        hyper = proto; 
        proto = hyper.__proto__; 
       } 

       hyper.__proto__ = child; 

       return uber; 
      }; 

      var constructor = definition.call(this, uber); 
      constructor.apply(this, arguments); 
     }; 

     if (base instanceof Class) { 
      klass.__proto__ = base; 
      var child = klass.prototype; 
      var parent = child.__proto__ = base.prototype; 
     } else klass.__proto__ = prototype; 

     return klass; 
    } 
}(); 

這讓我如下創建類:

var Rectangle = new Class(function() { 
    var width; 
    var height; 

    function constructor(length, breadth) { 
     width = length; 
     height = breadth; 
    } 

    this.area = function() { 
     return width * height; 
    }; 

    return constructor; 
}); 

繼承很簡單,只要:

var Square = new Class(function (uber) { 
    return function (side) { 
     uber(side, side); 
    }; 
}, Rectangle); 

您也可以使用基類方法,如:

var Cube = new Class(function (uber) { 
    var side; 

    function constructor() { 
     side = arguments[0]; 
     uber = uber(side); 
    } 

    this.area = function() { 
     return 6 * uber.area(); 
    }; 

    this.volume = function() { 
     return side * uber.area(); 
    }; 

    return constructor; 
}, Square); 

每個類都有它自己的原型對象。因此,原型或類本身的任何屬性(靜態屬性)都會由每個派生類自動繼承。在調用uber函數之前,類中定義的屬性將不會被繼承。 uber函數返回基類的一個實例,以便可以調用基類方法。

編輯:這裏是上面的圖案的working example

var cube = new Cube(5); 
alert("Side of the cube: 5"); 
alert("Area of the cube: " + cube.area());  // 150 
alert("Volume of the cube: " + cube.volume()); // 125