Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   В чём отличие сокращенной записи метода объекта (https://javascript.ru/forum/misc/83107-v-chjom-otlichie-sokrashhennojj-zapisi-metoda-obekta.html)

lgick 16.09.2021 17:24

В чём отличие сокращенной записи метода объекта
 
В учебнике на странице

https://learn.javascript.ru/object-m...a-zapis-metoda

написано про сокращенную и обычную записи методов объекта:

"Нужно отметить, что эти две записи не полностью эквивалентны. Есть тонкие различия, связанные с наследованием объектов (что будет рассмотрено позже), но на данном этапе изучения это неважно. В большинстве случаев сокращённый синтаксис предпочтителен."

user = {
  sayHi: function() {
    alert("Привет");
  }
};

// сокращённая запись выглядит лучше, не так ли?
user = {
  sayHi() { // то же самое, что и "sayHi: function()"
    alert("Привет");
  }
};



так чем же они отличаются? Не нашёл информацию в учебнике

Aetae 16.09.2021 18:52

По моему никакой разницы.)
М.б. со стрелками спутали.

ksa 16.09.2021 19:50

Цитата:

Сообщение от lgick
Не нашёл информацию в учебнике

Я ее не нашел и в других местах... :no:

destus 17.09.2021 06:51

lgick,
Во втором случае тебе будет доступен super внутри твоего метода.
https://learn.javascript.ru/es-object#super

Aetae 17.09.2021 10:41

Цитата:

Сообщение от destus (Сообщение 540268)
lgick,
Во втором случае тебе будет доступен super внутри твоего метода.
https://learn.javascript.ru/es-object#super

Вот же нахуевертили в моём js.
Вот почему super нельзя юзать в свойствах-функциях, т.к. они "не привязаны к [[HomeObject]]", но если ты вдруг используешь новомодные приватные переменные(this.#var) - это таки без проблем привяжет функцию к конкретному классу?..

voraa 17.09.2021 23:14

Цитата:

Сообщение от Aetae
но если ты вдруг используешь новомодные приватные переменные(this.#var) - это таки без проблем привяжет функцию к конкретному классу?

Что имеется в виду?

Aetae 17.09.2021 23:59

voraa,
Так можно, и функция намертво привяжется к A:
class A {  
  #private = 'ok'
  s = function() {
    console.log(this.#private)
  }
}

Так нельзя, потому что функция не привяжется к А:
class Parent {
  method() {
    console.log('ok')
  }
}
class A {  
  s = function() {
    super.method()
  }
}


Видать разные ребята говняли.

voraa 18.09.2021 10:07

Цитата:

Сообщение от Aetae
Так нельзя, потому что функция не привяжется к А:

class A { 
  s = function() {
    super.method()
  }
}

Так нельзя просто потому, что это вызывает СИНТАКСИЧЕСКУЮ ошибку

voraa 18.09.2021 10:29

Цитата:

Сообщение от Aetae
Так можно, и функция намертво привяжется к A:

Я бы не назвал это привязкой. Привязкой можно считать ситуацию, когда функцию переносят в другой класс, а она продолжает работать так, как будто она в исходном
Ну типа
class P1 {
    out () {console.log ('P1')}
}

class P2 {
    out () {console.log ('P2')}
}

class P3 {
    out () {console.log ('P3')}
}

class A extends P1{
    out () {super.out()}
}

let a = new A()
a.out()     // P1

class B extends P2{
    out = a.out    // перенесли так
}

let b = new B()
b.out()      //P1

class C extends P3{
}

C.prototype.out = A.prototype.out  // или так

let c = new C()
c.out()      //P1


А в примере с приватными членами при попытке перенести что то просто не будет работать - вылетит с ошибкой.

Aetae 18.09.2021 10:42

Суть в том что раз она вылетает с ошибкой, то она знает что оказалась где-то не там. А вся суть ошибки с super в том, что она типа не может знать.
Неконсистентность. Оно должно или в обоих случаях вылетать на этапе декларирования, или в обоих случаях вылетать при попытке перетасовать. Имеем же то что super нельзя декларировать в function - упадёт, но можно перетасовать метод и он сохранит привязку, а приватные свойства можно декларировать в function, но зато при перетасовке упадёт. Противно как-то.


Часовой пояс GMT +3, время: 15:04.