2011-09-27 2 views
2

Итак, у меня есть этот класс javascript под названием Car, и я определил его экземпляр 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 для Prius, к чему-то вроде этого:

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

Любые предложения, и я прав, говоря, что Javascript лечит автомобиль как " abstract ', Car.sellSelf() терпит неудачу.

Спасибо за помощь!

+4

Это не правда. JavaScript OOP. Google для 'javascript prototype' для получения дополнительной информации. –

+0

Если вы хотите использовать ООП с JavaScript, вам лучше использовать тот же 'lib' как * Prototype * или * Base *. – user278064

+0

javascript не имеет «классов» как таковых, просто функций, возвращающих объекты (которые могут _behave_ как классы). Вы должны обязательно изучить наследование JS от прототипа. – tjarratt

ответ

5

Вы можете просто установить метод prius:

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

Если вы хотите запрограммировать в JS ООП, используйте 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 

EDIT: Работает sample.

Смежные вопросы