Javascript Доступ к родительскому объекту внутри функции - PullRequest
0 голосов
/ 20 июня 2011

У меня есть эта функция Car:

var Car = function(vendor, model, year) {
    return {
        vendor: vendor,
        model: model,
        year: year,
        name: (function() {
            return vendor + " " + model + " " + year;
        })()
    };
};
var foo = Car("Toyota","Corola",2007);
alert(foo.name);  //alerts "Toyota Corola 2007"

Это работает, но я хочу, чтобы name мог меняться в соответствии с vendor, model и year.

taxi.vendor = "Mitsubishi";
alert(taxi.vendor); //still alerts "Toyota Corola 2007"

Как я могу вместо этого сделать это предупреждение Mitsubishi Corola 2007 в соответствии с изменением свойства vendor?

РЕДАКТИРОВАТЬ: И улов - name должно оставаться свойством, которое не нужно вызывать как функцию.

Ответы [ 3 ]

3 голосов
/ 20 июня 2011

В последних версиях WebKit (Safari, Chrome) или Firefox вы можете определять функции получения и установки :

var o = {a: 7, get b() {return this.a + 1;}, set c(x) {this.a = x / 2}};
o.b // result is 8
o.a = 10
o.b // result is 11

Тогда вы бы сделали это:

var Car = function(vendor, model, year) {
    return {
        vendor: vendor,
        model: model,
        year: year,
        get name() { return this.vendor + " " + this.model + " " + this.year; }
    };
};

И получите желаемый результат.

Я не знаю, поддерживают ли IE или Opera ту или иную версию. Если вам нужно поддерживать что-либо, кроме недавних браузеров Safari, Chrome или Firefox, тогда лучше использовать функцию для доступа к имени, а не оставлять его как свойство:

var Car = function(vendor, model, year) {
    return {
        vendor: vendor,
        model: model,
        year: year,
        name: function() { return this.vendor + " " + this.model + " " + this.year; }
    };
};

А потом:

var foo = Car("Toyota","Corola",2007);
alert(foo.name());  //alerts "Toyota Corola 2007"
foo.vendor = "Mitsubishi";
alert(foo.name());  //alerts "Mitsubishi Corola 2007"
2 голосов
/ 20 июня 2011

Когда вы используете name: (function() {return vendor + " " + model + " " + year;})(), это означает, что для свойства name будет установлено результат выполнения этой функции . Это происходит, когда вы создаете новый Car. Но, похоже, вы хотите, чтобы это динамически обновлялось, поэтому рассмотрите возможность использования name как функции-получателя, а не просто строкового свойства:

name: function() {return vendor + " " + model + " " + year;}

Затем вы можете выполнить alert(taxi.name()), который будет динамически объединять строки поставщика, модели и года.

2 голосов
/ 20 июня 2011

Как насчет:

 var Car = function(thevendor, themodel, theyear) {
    this.vendor = thevendor;
    this.model = themodel,
    this.year = theyear,
    this.name = function() {
            return this.vendor + " " + this.model + " " + this.year;
        };
    return this;
};


var foo = new Car("Toyota","Corola",2007);
alert(foo.name());  //alerts "Toyota Corola 2007"

foo.vendor = "Mitubishi";
alert(foo.name());  //alerts "Mistubishi Corola 2007"

JSFiddle для этого кода: http://jsfiddle.net/duncan_m/gZKQD/

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