在特定实例上实现方法?

时间:2011-09-27 16:54:31

标签: javascript oop

所以我有一个名为Car的javascript类,我已经定义了它的一个实例,一个普锐斯。

Car  = 
function Car ()
{
     var mileage = 10;
     var maker = "Basic";
     var model = "Model";



   return {

   'sellSelf'   : function()  { return "I am a "+  model+ " from " +   maker + " with mpg "+  mileage;}    ,
   'getMileage' : function()  { return mileage; } ,
   'setMileage' : function(m) { mileage = m; }    ,
   'getMaker'   : function()  { return maker; } ,
   'setMaker'   : function(m) { maker = m; }    ,
   'getModel'   : function()  { return model; } ,
   'setModel'   : function(m) { model = m; }    
   };    
}


Prius = new Car();
Prius.setMaker('Toyota');
Prius.setModel('Prius');
Prius.setMileage(500);
alert(Prius.sellSelf());
alert(Prius.getMileage());

我希望能够覆盖Prius的sellSelf方法,如下所示:

function sellPrius() { return "I'm a snooty car with "+getMileage()+ " mpg "; }

任何建议,我是说得对,javascript将Car视为'抽象',Car.sellSelf()失败。

感谢您的帮助!

3 个答案:

答案 0 :(得分:5)

您可以设置prius的方法:

Prius.sellSelf = function() { return "I'm a snooty car with " + this.getMileage() + " mpg "; }

答案 1 :(得分:4)

如果您想在JS OOP中编程,请使用prototypenew前缀仅对具有修改原型的函数有意义,使用this来访问变量和方法。使用new时,函数的返回值为而不是。相反,返回该类的实例,该实例等于该函数中的this变量。

原型的优点是功能是静态的,只定义一次。 Car类的一百个实例只有一组共享方法。当你使用

示例:

function Car(){
    //Optional: Default values
    this.maker = "Unknown manufacture";
    this.model = "Unknown model";
    //NO return statement
}
Car.prototype.setMaker = function(maker){this.maker = maker}
Car.prototype.setModel = function(model){this.model = model}
//Et cetera
Car.prototype.getMaker = function(){return this.maker}
Car.prototype.getModel = function(){return this.model}
//Etc
Car.prototype.sellSelf = function(){return "Model: "+this.model+"\nMaker"+this.maker}

var Prius = new Car();
Prius.setMaker("Toyota")
Prius.setModel("Prius");
//Etc
alert(Prius.sellSelf());

通过设置Car.prototype.newMethod = function(){}可以轻松添加新方法。证明了一个巨大的优势:Car的所有实例现在都有这种方法,所以你只需要定义一次函数,而不是Prius.newMethod = ..; BMW.newMethod = ..

答案 2 :(得分:0)

要继承JavaScript属性/函数,您需要将它们添加到原型中,而不是添加到对象本身。这是一个简化的例子。

Car.prototype.sellSelf = function()  { return "A";}
var prius = new Car();

prius.selfSell(); // returns A

//override
prius.sellSelf = function()  { return "B";}

prius.sellSelf(); // returns B

编辑:这是有效的sample