Новый метод копирования экземпляра объекта имеет неопределенный контекст.(извините за вводящее в заблуждение название) - PullRequest
0 голосов
/ 24 сентября 2019

Мне интересно, почему этот код ES6 выводит undefined:

class Test {
  constructor(name) {
    this.name = name;
  }
  
  log() {
    console.log(this);
  }

}


const t = new Test('asd');
const asd = t.log;
asd();

но этот код ES5 выводит window.

 function Test(name) {
   this.name = name;
 }
 
 Test.prototype.log = function() {
   console.log(this)
 }
 
 const t = new Test('newer test');
 const asd = t.log;
 asd();

Технически с чем-то вызывается в глобальном счете, у которого есть окно. Это что-то впереди, но, очевидно, если это что-то - класс, то окна нет.

1 Ответ

0 голосов
/ 24 сентября 2019

Это потому, что по умолчанию class ваш код использует строгий режим .Обычно значение this будет присвоено глобальному объекту (window), если не определено , но в строгом режиме оно установлено на undefined для предотвращения случайных проблем, таких как использование свойств глобальногообъект:

function sayName() {
  console.log("Hello, my name is " + this.name + "!");
}

function sayNameStrict() {
  "use strict";
  console.log("Hello, my name is " + this.name + "!");
}

let obj = {
  name: "Fred",
  sayName: sayName,
  sayNameStrict: sayNameStrict
}

obj.sayName(); //this = obj, this.name = "Fred

sayName(); //this = window, this.name = window.name

obj.sayNameStrict(); //this = obj, this.name = "Fred

sayNameStrict(); //this = undefined, this.name = TypeError

Итак, если вы выполните второй фрагмент кода в строгом режиме, вы получите тот же результат, что и класс ES6:

"use strict";

function Test(name) {
  this.name = name;
}

Test.prototype.log = function() {
  console.log(this)
}

const t = new Test('newer test');
const asd = t.log;
asd();
...