Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Собственные функции-конструкторы и прототипы (https://javascript.ru/forum/misc/71155-sobstvennye-funkcii-konstruktory-i-prototipy.html)

Luca 29.10.2017 21:36

Собственные функции-конструкторы и прототипы
 
Здравствуйте.
Допустим у нас есть собственный конструктор(пример из книги):
var Person = function (name) {
    this.name = name;
    this.say = function () {
        return “I am “ + this.name;
    };
};

далее автор размышляет:
Цитата:

В результате при каждом вызове конструктора new Person() в памяти будет
создаваться новая функция. Совершенно очевидно, что это неэкономный подход к расходованию памяти, потому что реализация метода say() не изменяется от одного экземпляра к другому. Эффективнее было бы добавить метод к прототипу функции Person:
Person.prototype.say = function () {
    return “I am “ + this.name;
};

хорошо, а если мы используем ES6 синтаксис, будет ли данный код эквивалентен тому, что на ES5?
class Person {
    constructor(name){
        this.name = name;
    }
    say(){
        return "I am " + this.name;
    }
};

с одной стороны да, say(){} "пойдет" в прототип объекта, но с другой стороны, когда мы выполняем инструкцию
Person.prototype.say = function () {
    return “I am “ + this.name;
};

то выполняем её один раз и далее "клепаем" объекты чколько угодно, имея в прототипе say(), в ES6 say() тоже пойдет в прототип, но будет писаться каждый раз - я правильно понимаю?
как на ES6 выполнить
Person.prototype.say = function () {
    return “I am “ + this.name;
};

внутри самого класса?
например
console.clear();
class ProtoPerson {
    constructor(){}
    say(){
          return "I am " + this.name;
    };
};
class Person extends ProtoPerson {
    constructor(name){
        super();
        this.name = name;
    } 
};
let pers = new Person("Luca");
console.log( pers.say() );
console.log(pers);

Alexandroppolus 30.10.2017 11:24

Цитата:

Сообщение от Luca
в ES6 say() тоже пойдет в прототип, но будет писаться каждый раз - я правильно понимаю?

нет.
такая запись - именно эквивалент однократного выполнения
Person.prototype.say = function () {
    return “I am “ + this.name;
};


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