在javascript中並沒有class這個關鍵字,而是以function的方式,去配置一個物件,所以function可以直接使用,也可拿來配置物件。接著以下都直接以配置物件的function,稱為class,那麼在class之中,宣告var來當一個private的變數,若是沒宣告則會是一個全域變數,在function裡面的code,當開使去new的時候,裡面的code都會被執行一次,其中this為指向物件本身,換句話說就是一個public的屬性,this與prototype的差異是,this是每個物件自己擁有的,而prototype則是所有class共用的。
以下是一個範例:
/** * @class * @constructor */ function Car(){ /** * @private */ var _name; var _speed = 40; /** * @param {String} name */ this.setName = function(name){ _name = name; } /** * @param String */ this.getName = function(){ return _name; } /** * @type int */ this.getSpeed = function(){ return _speed; } /** * */ this.run = function(){ console.log("moving:"+_speed+"km/hr"); } } /** * */ Car.prototype.show = function(){ console.log("name:"+this.getName()); console.log("speed:"+this.getSpeed()+"km/hr"); } /** * @static */ Car.powerRun = function(){ console.log("moving:"+this.getSpeed()+"→100km/hr"); } var car = new Car(); car.setName("cloud"); car.run(); car.show(); //moving:40→100km/hr Car.powerRun.call(car);
以上比較值得注意的是,call這個function,主要是把object丟到指定的function上面跑,簡單來說就是把this直接替換成object的名稱,例如:
this.getSpeed(); car.getSpeed();
以上這兩行在範例中執行的,與Car.powerRun.call(car)是畫上等號的,再來call與apply是同樣的功能,差別在於傳值call必須寫成:
functionName.call(object,param1,param2....);
而apply的傳遞參數則是一個array:
functionName.apply(object,array);