Javascript Object Oriented Concepts

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);