Как исправить ошибку «Не конструктор» в javascipt - PullRequest
2 голосов
/ 22 апреля 2019

Я пытаюсь понять, как работают прототипы объектов, и поэтому попробовал кусок кода из книги 'Javascript: The Good Parts' и получил ошибку.

Я изменил код просто для удовольствия и получилОшибка.Он работает и показывает вывод, если исходный код запущен.

Это оригинальный код , и он не дал ошибок.

let stooge = {
    'first-name': 'John',
    'last-name' : 'Peter'
};

if(typeof Object.create !== 'function') {
Object.create = (o) => {
    let F = () => {};
    F.prototype = o;
    return new F();
};
}

let theOtherStooge = Object.create(stooge);
console.log(theOtherStooge['first-name'], theOtherStooge['last-name']);

Я удалил условие if и получил сообщение о том, что F не является функцией конструктора.Может ли кто-нибудь объяснить мне, почему это происходит?Пожалуйста, извините, я новичок в программировании.

Модифицированный код:

let stooge = {
    'first-name': 'John',
    'last-name' : 'Peter'
};

Object.create = (o) => {
let F = () => {};
    F.prototype = o;
    return new F();
};

let theOtherStooge = Object.create(stooge);
console.log(theOtherStooge['first-name'], theOtherStooge['last-name']);

1 Ответ

1 голос
/ 22 апреля 2019

По крайней мере, в Chrome Object.create уже определена как функция, поэтому ни один из кодов в операторе if первого примера не выполняется. Без оператора if выполняется код, выдавший исключение. Причина ошибки заключается в том, что лямбда-функция, присвоенная F, не считается конструктором. На основании этого ответа проблема заключается в том, что объект this назначается области, окружающей лямбда-функцию, когда он создан , тогда как this назначается объекту вызов функции при использовании обычной функции. Вместо этого вы можете изменить код, чтобы использовать обычную функцию:

let stooge = {
  'first-name': 'John',
  'last-name': 'Peter'
};

Object.create = (o) => {
  let F = function() {};
  F.prototype = o;
  return new F();
};

let theOtherStooge = Object.create(stooge);
console.log(theOtherStooge['first-name'], theOtherStooge['last-name']);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...