#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 как просто пространство имен, я должен использовать явную ссылку. Я правильно понял?