Свойство объекта «Предыдущее значение» в Javascript - PullRequest
2 голосов
/ 10 марта 2009

Я только начинаю думать об этой объектно-ориентированной вещи, так что терпите меня.

Итак, я видел пример функции объекта (для Javascript), где вы присваиваете новое значение, и это значение присваивается в качестве фактического значения этого свойства. Пример:

function Meat (name, color, price) {
    function newPrice (new_price) {
        this.price = new_price;
    }
 this.name = name;
 this.color = color;
 this.price = price;
 this.newprice = newPrice;
 }

Прекрасно и модно. Теперь у меня есть возможность назначить цену, используя Bacon.price или Bacon.newprice. Лично это кажется высшим порядком семантики, поскольку функционально это делает то же самое. Но как сторонник семантического кодирования, я позволю этому скользить. Вот что я хочу:

Когда я изменяю значение Bacon.price, объект должен включать функцию для автоматического сохранения старого значения в свойстве с именем oldprice. Я играл с этим, но ничего не получилось. Вот что я пробовал до сих пор:

function Meat (name, color, price) {
    function oldPrice () {
        this.oldprice = this.price;
    }
 this.name = name;
 this.color = color;
 this.oldprice = oldPrice;
 this.price = price;
 }

///////////////////////

function Meat (name, color, price) {
    this.name = name;
    this.color = color;
    this.oldprice = this.price;
    this.price = price;
}

Более или менее вариации этого. Я думал, что обращения к уже назначенному значению (которое было бы ничем в первый раз) до назначения нового значения будет достаточно. Я знаю, что значение (или его отсутствие) хранится где-то до того, как оно будет присвоено, я просто не знаю, как ссылаться на него, чтобы присвоить его свойству oldvalue, прежде чем оно будет уничтожено.


Хорошо, может проблема в моих глазах или пальцах? Потому что я думал, что попробовал предложения перед тем, как спросить (я знаю, я не упомянул их!) Если только я не запутался, это должно сработать:

function Meat(price)
{

    function setPrice(price)
    {
        this.oldprice = this.price;
        this.price = price;
    }

this.price=setPrice;
}

bacon = new Meat()
bacon.price = "Expensive";
document.write(bacon.price+"<br />");
document.write(bacon.oldprice+"<br />");
bacon.price = "Cheap";
document.write(bacon.price+"<br />");
document.write(bacon.oldprice+"<br />");

Но вывод, который я получаю: Дорого не определено дешево не определен

Все хорошо до последнего. Снова, я готов принять плохое зрение и плохое правописание как корень. Но я не могу понять это.

Ответы [ 8 ]

2 голосов
/ 10 марта 2009

Это сохранит его при вызове obj.newPrice(xxx); - я не думаю, что вы можете сделать это автоматически при использовании obj.price = xxx;

function Meat (name, color, price) {
    function newPrice (new_price) {
        this.oldprice = this.price
        this.price = new_price;
    }
 this.name = name;
 this.color = color;
 this.price = price;
 this.newprice = newPrice;
 }

Edit:

Как отмечает @Mauris, Javascript 1.5 поддерживает геттеры и сеттеры (см. Также здесь - их можно рассматривать как методы, замаскированные под свойства.

Используя их, ваш код будет выглядеть так:

function Meat (name, color, price) {
    function newPrice (new_price) {
        this.oldprice = this.price
        this.price = new_price;
    }
 this.name = name;
 this.color = color;

 this.__defineSetter__("price", function(newprice)
 {
       this.oldprice = this.price
       this.price = price;
 });
 }

К сожалению, этот синтаксис пока не поддерживается Internet Explorer.

1 голос
/ 05 апреля 2014
store = (function (prev) {
    callee = arguments.callee;
    return function (curr) {

        console.log("prev:" + prev, "curr:" + curr);
        store = callee(curr);
    }
}(0)) //Initial value

store(1); //Output : prev:0 curr:1 
store(2); //Output : prev:1 curr:2
store(3); //Output : prev:2 curr:3
store(4); //Output : prev:3 curr:4
1 голос
/ 10 марта 2009

Это все?

function setPrice(price) {
  this.oldprice = this.price;
  this.price = price;
}
0 голосов
/ 12 марта 2010

Вы перезаписываете свою ценовую переменную. Не забывайте, что в javascript вы можете присвоить что-либо переменной, так как она не является строго типизированной. Итак, как у вас это настроено:

function Meat(price)
{

    function setPrice(price)
    {
        this.oldprice = this.price;
        this.price = price;
    }

this.price=setPrice; //<-- this assigns the function "setPrice" to the variable "this.price"
}

bacon = new Meat()
bacon.price = "Expensive"; //<-- this overwrites the "price" variable with a string
document.write(bacon.price+"<br />");
document.write(bacon.oldprice+"<br />");
bacon.price = "Cheap";
document.write(bacon.price+"<br />");
document.write(bacon.oldprice+"<br />");

Вы можете (как уже упоминалось) использовать геттеры и сеттеры, если вам не нужна поддержка IE. В противном случае используйте метод, который вы определили:

bacon = new Meat();
bacon.setPrice("Expensive");
document.write(bacon.price+"<br />");
document.write(bacon.oldprice+"<br />");
bacon.setPrice("Cheap");
document.write(bacon.price+"<br />");
document.write(bacon.oldprice+"<br />");

Поскольку вы действительно хотите принудительно получить доступ к этим значениям, я бы также написал для них геттеры:

bacon.getPrice();
bacon.getOldPrice();
0 голосов
/ 10 марта 2009

В JS (пока) нет геттеров / сеттеров или перегрузок операторов, поэтому вам действительно нужно написать функцию, чтобы установить цену и получить эти забавные побочные эффекты.

0 голосов
/ 10 марта 2009

, поскольку вы только начинаете использовать OO javascript, выслушайте этот совет:

не используйте новое ключевое слово для создания объектов. вместо этого используйте функциональное наследование. Таким образом, вы можете легко получить приватные переменные, и я думаю, что синтаксис намного проще. проверить это:

var meat = function(name, color, price){
   var that = {};
   var name = name;
   var price = price;
   var color = color;
   var oldPrice = null;
   var setPrice = function(p){
      oldPrice = price;
      price = p;
   };
   var getPrice = function(){ return price;};
   var getOldPrice = function(){return oldPrice;};
   that.getPrice = getPrice;
   that.setPrice = setPrice;
   that.getOldPrice = getOldPrice;
   return that;
};

Вы можете использовать выше, как это:

var m = meat("chicken", "white", 100);
m.setPrice(50);
var old = m.getOldPrice();

теперь вам может понадобиться метод getName, setName и т. Д. Если вы хотите наследовать, вы можете сделать что-то вроде этого:

var cow = function(name){
    var that = meat(name, "spotted", 100);
    that.moo = function() { return name +" moooo"; };
    return that;
}

в любом случае, возможно, я ответил не на тот вопрос, но, возможно, вы прочтете это и увидите свет :)

0 голосов
/ 10 марта 2009

Во-первых, я не уверен, что вы правильно используете OOP Javascript. ООП Javascript изначально не является объектно-ориентированным программированием, а вместо этого работает на прототипе:

Например:

function Meat (name, color, price) {
       if(arguments.length > 0) 
    {
        this.init(name, color, price);
    }
}

Meat.prototype.init = function(name, color, price) {
    this.name = name;
    this.color = color;
    this.price = price;

    // Initially these are all set to null, 
    // because they don't have an old value yet.
    this.old_name = null;
    this.old_color = null;
    this.old_price = null;
};

И это составило бы ваш конструктор.

Далее нам нужно добавить несколько методов, чтобы ваши старые значения могли быть сохранены:

Meat.prototype.setName = function(new_name) {
    // Store the old name of the meat
    this.old_name = this.name;
    this.name = new_name;
};

И вы бы написали такой метод для каждого свойства вашего мяса.

0 голосов
/ 10 марта 2009

Подумайте, что вы пытаетесь сделать:
1. Запомните старую цену
2. Измените текущую цену на новую

Поскольку это два шага того, что вы хотите сделать, вам нужно вставить их в функцию one . Сначала вам нужно будет запомнить текущую цену (в этой. Старой цене), и , а затем изменить текущую цену (в этой цене). Ответы от Роборга и Черувима содержат код для этого.

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