Реализовать метод для конкретного экземпляра? - PullRequest
2 голосов
/ 27 сентября 2011

Итак, у меня есть класс 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 рассматривает Car как «абстрактный», Car.sellSelf () завершается неудачей.

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

Ответы [ 3 ]

5 голосов
/ 27 сентября 2011

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

Prius.sellSelf = function() { return "I'm a snooty car with " + this.getMileage() + " mpg "; }
4 голосов
/ 27 сентября 2011

Если вы хотите программировать в 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 голосов
/ 27 сентября 2011

Чтобы свойства / функции 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

РЕДАКТИРОВАТЬ: Вот работает образец .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...