JavaScript: получить имя переменной в методе, определенном в прототипе - PullRequest
0 голосов
/ 28 ноября 2011

Как я могу получить имя переменной в методе, который я определил в прототипе String ()?

String.prototype.foobar = function() {alert(/*something here...*/);};
var s="I'm just a stupid string!";
s.foobar();

Должен вернуть предупреждение, содержащее "s" ...

Как мне это сделать?

С уважением.

Edit:

Результат этой темы можно скачать здесь: https://github.com/ninov/onChange

Ответы [ 4 ]

1 голос
/ 28 ноября 2011

«Я хочу создать вид настраиваемого события, которое проверяет, изменяется ли строка»

Это невозможно.Строки являются неизменяемыми.

И если вы хотите, чтобы функция оповестила фактическое имя переменной, это тоже невозможно.Если у вас есть объект String, может быть несколько переменных, ссылающихся на один и тот же объект.Как узнать, какое имя использовать?

Вы должны определить объект, который делает то, что вы хотите.Предпочтительно с сеттерами и геттерами.

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

var str_obj = (function() {

    var s = "my string";

    return {
        getString: function() {
            return s;
        },
        setString: function( new_s ) {
            s = new_s;
            alert("s changed!");
        }
    };
})();

alert( str_obj.getString() ); // alerts "my string"

str_obj.setString( "new string" ); // alerts "s changed!"

alert( str_obj.getString() ); // alerts "new string"
0 голосов
/ 28 ноября 2011

Ну, это на самом деле работает.

Если вы измените этот фрагмент на:

String.prototype.foobar = function() {alert(this);};

тогда s.foobar(); оповестит "I'm just a stupid string!"

Если это не сработает, скажите, на каком двигателе вы тестируете.

Боюсь, что нет способа получить исходное имя переменной.

0 голосов
/ 28 ноября 2011

Это невозможно. И это не должно быть.

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

var obj = {
   s: "I'm just a stupid string!"
};

for(var x in obj){
  alert(x + '=' + obj[x]); // logs: s=I'm just a stupid string!
}

Но зачем вам знать имя переменной программно?

0 голосов
/ 28 ноября 2011

Javascript имеет строковые примитивы (которые не являются истинными объектами javascript) и строковые объекты, которые имеют методы. Я предполагаю, что строковые примитивы более эффективны, и статически объявленная строка, как у вас, по умолчанию будет примитивом. В большинстве случаев Javascript автоматически преобразует примитив в объект при необходимости. Когда я запускаю ваш код в Chrome, он делает это, и я получаю предупреждение.

Если вы хотите убедиться, что это объект, вы можете объявить его следующим образом:

String.prototype.foobar = function() {alert("fun");};
var s = new String("I'm just a stupid string!");
s.foobar();

Подробнее об этом см. В разделе «Различие между строковыми примитивами и строковыми объектами» здесь .

Если вы пытаетесь получить имя переменной из метода foobar (), то это не то, что Javascript поддерживает любым стандартным способом.

Если ни один из них не является тем, о чем вы на самом деле спрашиваете, уточните свой вопрос.

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