Есть ли какие-либо недостатки в использовании имени объекта напрямую (а не ключевого слова this) в JavaScript?

#javascript

#javascript

Вопрос:

Допустим, у меня есть следующий код:

 var myObj = {
    // Case 1
    myFunc1: function() {...},
   
    // Case 2
    myFunc2: function() {
        console.log(this.myFunc1);

        console.log(myObj.myFunc1);
    }
}
  

В обоих случаях результат один и тот же. Теперь мой вопрос таков: есть ли какие-либо недостатки в использовании myObj.myFunc1() always ? Мне не нравится использовать this ключевое слово, и часто возникают неожиданные проблемы, которые я не могу понять. Если я просто использую имя своего объекта для прямого вызова функции, с какими неожиданными крайними случаями я могу столкнуться?

Комментарии:

1. В этом простом коде нет. Но жаль, что вы предпочитаете обходить «то, что вам не нравится», а не изучать, как на самом деле работает язык.

Ответ №1:

Это действительно сводится к методам ООП и экземпляра против статических.

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

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

https://abdulapopoola.com/2013/03/30/static-and-instance-methods-in-javascript/

Ответ №2:

Оба this without this способа и доступны, но они делают разные вещи, когда дело доходит до наследования с переопределенным статическим методом. Выберите тот, поведение которого вы ожидаете:

 class Profile {
  static Admin() {
    return "Admin";
  }
  usernameA() {
    console.log(Prfile.Admin());
  }
  usernameB() {
    console.log(this.constructor.Admin());
  }
}
class SubProfile extends Profile {
  static Admin() {
    return "SubProfile";
  }
}
new SubProfile ().usernameA(); // Profile
new SubProfile ().usernameB(); // SubProfile
  

Зависимость от статического свойства через класс будет фактически статической и постоянно давать одно и то же значение. Использование this.constructor вместо этого будет использовать динамическую отправку и ссылаться на класс текущего экземпляра, где статическое свойство должно иметь унаследованное значение, но также может быть переопределено.

Если вы ожидаете, что статические свойства не будут переопределены, используйте явную ссылку.

Комментарии:

1. Спасибо за этот описательный ответ. Другими словами, пока я не хочу использовать ООП, а вместо этого использую this object как просто пространство имен, я должен использовать явную ссылку. Я правильно понял?