Это потому, что по умолчанию 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();