Muranx
@Muranx
кто понял this тот в цирке не смеётся

Как объяснить конструкцию return this?

НЕрабочий вариант кода:
var Person = {
    constructor: function(name,age){
    this.name=name;
    this.age=age;
    //return this
  }
};

var One = Object.create(Person).constructor("Alex", 32);


console.log(One.name);
console.log(One.age);


Код начинает работать только в том случае, если в методе constructor прописан return this, объясните если можно детально, как это происходит? Т.к. this определяется во время вызова функции, то по идее this в методе constructor должен указывать на объект One! Но выходит что не должен! Что означает конструкция return this?
  • Вопрос задан
  • 638 просмотров
Решения вопроса 1
potapchino
@potapchino
все банально. смотрите на эту строчку кода:
var One = Object.create(Person).constructor("Alex", 32);

чему будет равна переменная One? она будет равна тому, что вернет метод .constructor(). а что он возвращает? ничего. а точнее undefined. когда функция явно ничего не возвращает, она возвращает undefined. поэтому строчка кода выше, эквивалента строчке:
var One = undefined
а ваш метод constructor на самом деле сейчас выглядит вот так:
constructor: function(name,age){
    this.name=name;
    this.age=age;
    
    return undefined
  }


Что означает конструкция return this?
означет, что функция возвращает текущий контекст. контекстом в данном случае будет являтся объект, созданный с помощью Object.create()
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Xuxicheta
@Xuxicheta
инженер
constructor работает как конструктор только в составе es6 класса.
А у вас тут это просто обычная функция, если вы ничего из нее не возвращаете, то она ничего и не вернет.
Т.е. вы создаете объект, присваиваете ему прототип Person и обращаетесь к свойству constructor этого объекта.
В объекте такого свойства нет, ищется в цепочке прототипов, находится и вызывается функция на которую указывает One.__proto__.constructor

А правильно будет так

class Person {
  constructor(name,age) {
    this.name=name;
    this.age=age;
  }
};

var One = new Person("Alex", 32);


другой вариант
var Person = {
    constructor: function(name,age){
    this.name=name;
    this.age=age;
  }
};

var One = Object.create(new Person.constructor("Alex", 32));
console.log(One.name);

но в этом случае One будет иметь прототипом не Person, а новый объект, созданный через Person.constructor
Ответ написан
VladimirAndreev
@VladimirAndreev
php web dev
Ну, в js constructor - это соглашение, в отличие от того же php, где конструктор возвращает созданный объект
Ответ написан
Medovnik
@Medovnik
Вот так работает
function Person(name,age){
    this.name=name;
    this.age=age;
};

var One = new Person("Alex", 32);


console.log(One.name);
console.log(One.age);

потому что THIS передается в качестве контекста через функцию-конструктор. А в твоем случае идет обращение к методу объекта
Person
Здесь необходимо вернуть контекст, чтобы интерпретатор понимал, где искать метод
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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