Зачем использовать это ключевое слово здесь для ссылки на объект? [Дубликат]

Этот класс файла java имеет Pin, потому что этот класс является final class

Возможно, вы объявили этот класс как final class:)

Чтобы узнать подробнее о: Символы для Android

14
задан Jason 22 May 2012 в 23:30
поделиться

5 ответов

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

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

Когда func не вызывается как метод obj, this может ссылаться на что-то другое (здесь : глобальный объект «window»).

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);
18
ответ дан RobG 26 August 2018 в 21:36
поделиться

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

1
ответ дан ChristopheCVB 26 August 2018 в 21:36
поделиться

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

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

Так как это вызовет ошибку. Помимо этого, вы должны быть добрыми!

0
ответ дан Elliot Bonneville 26 August 2018 в 21:36
поделиться

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

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

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

Демо: http://jsfiddle.net/m6CU3/

1
ответ дан mellamokb 26 August 2018 в 21:36
поделиться

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

Значение функции 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() делает не значение this - obj.

Для получения дополнительной информации смотрите , что MDN должен сказать о this .

1
ответ дан nnnnnn 26 August 2018 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: