2011-09-27 84 views
2

所以我有这个叫做Car的JavaScript类,我定义了它的一个实例,一个Prius。在特定实例上实现方法?

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

我希望能够覆盖sellSelf方法的普锐斯,以这样的:

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

任何建议,我是说得很对,JavaScript是处理汽车作为“抽象',Car.sellSelf()失败。

感谢您的帮助!

+4

这不是真正的JavaScript OOP。 Google for'javascript prototype'获取更多信息。 –

+0

如果你想在JavaScript中使用OOP,最好使用与* Prototype *或* Base *相同的'lib'。 – user278064

+0

javascript本身没有'classes',只是返回对象的函数(可能_behave_像类一样)。你一定要看看原型的JS继承。 – tjarratt

回答

5

您可以只设置方法prius

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

如果你想在JS OOP编程,使用prototype。前缀new只适用于具有修改原型的函数,使用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 = ..

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