Javascript: Object Литеральная ссылка в функции собственного ключа вместо 'this'

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

Вот пример того, о чем я говорю:

вместо:

var obj = {
    key1: "it",
    key2: function(){return this.key1 + " works!"}
};
alert(obj.key2());

с помощью:

var obj = {
    key1: "it",
    key2: function(){return obj.key1 + " works!"}
};
alert(obj.key2());

Ответы на вопрос(5)

Решение Вопроса

Оба могут быть проблематичными.

var obj = {
    key1: "it",
    key2: function(){ return this.key1 + " works!" }
};
var func = obj.key2;
alert(func()); // error

когдаfunc не называется методомobj, this может ссылаться на что-то еще (здесь: глобальный объект & quot;window& Quot;).

var obj = {
    key1: "it",
    key2: function(){ return obj.key1 + " works!" }
};
var newref = obj;
obj = { key1: "something else"; };
alert(newref.key2()); // "something else works"

Здесь мы получаем доступ к объекту из другой ссылки, хотяobj в функции теперь может указывать на какой-то другой объект.

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

var obj = (function(){
    var local = {
        key1: "it",
        key2: function(){ return local.key1 + " works always!" }
    };
    return local;
})();

или тыbind() функция к объекту:

var obj = {
    key1: "it",
    key2: function(){ return this.key1 + " works always!" }
}
obj.key2 = obj.key2.bind(obj);

Там будет разница в привязке переменной области. Если вы позже измените obj, вы измените возвращаемое значение key2:

var newobj = obj;
obj = { key1: "new" };
alert(newobj.key2());

Теперь он предупреждает "новые работы!", Потому что даже если вы звонитеkey2() на оригинальный объект (который сейчасnewobj), ссылка наobj.key1 теперь привязывается к стоимости новогоobj пример. С помощьюthis предотвращает это

Демо-версия:http://jsfiddle.net/m6CU3/

Если вы не используете объект-прототип, вы должны сделать это. поскольку все экземпляры вашего объекта будут возвращать значение экземпляра obj ...

Я не думаю, что есть какие-то последствия с моей головы. Просто убедитесь, что вы случайно не делаете это в любой момент:

var obj = {
    key1: "it",
    key2: key1 + " works!"
}

Как это приведет к ошибке. Кроме этого, вы должны быть хорошими, чтобы пойти!

Любой или оба из этих методов могут применяться в зависимости от ситуации.

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

obj.key2();
//or
obj["key2"]();

затемthis будет этот объект. Не важно, был ли объект создан литералом объекта или каким-либо другим способом.

Но вы можете использовать.call() или же.apply() вызвать функцию и явно установитьthis к другому объекту.

Учтите также:

var obj = {
    key1: "it",
    key2: function(){return this.key1 + " works!"}
};
alert(obj.key2()); // alerts "it works!"

var func = obj.key2;
alert(func())​;     // alerts "undefined works!"

Я настраиваюсьfunc ссылаться на ту же функцию, что иobj.key2, но называя это какfunc() делаетnot задаватьthis вobj.

Для получения дополнительной информации посмотрите нао чем MDN говоритthis.

Ваш ответ на вопрос