Почему мой оператор instanceof не отвечает true? - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь instanceof оператор. Я попробовал что-то вроде этого.

function f(){ return f; }
new f() instanceof f;
// false

Почему это оказалось false, когда это true

function f(){ return f; }
new f() instanceof Function; 
// true

function f(){ return f; }
new f() instanceof Object;
//true

При попытке сохранить это в переменной все равно получилось

function f(){ return f; }
var n = new f();

n instanceof f;
// false

n();
// function f()

n() instanceof f;
// false

n instanceof Function     // true
n() instanceof Function   // true

Почему return f; заявление изменило все? Что return f сделал, чтобы вызвать такое поведение?

Ответы [ 3 ]

0 голосов
/ 02 сентября 2018

Вы возвращаете f из вашего конструктора. f является конструктором. Таким образом, ваш конструктор никогда не создает экземпляр , вы просто всегда проверяете, является ли конструктор самим собой. Что это не так по определению.

0 голосов
/ 02 сентября 2018

Во-первых, я бы порекомендовал проверить статью о новом операторе: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new

В частности, обратите внимание, что

Когда выполняется код new Foo (...), происходят следующие вещи:

  1. Создан новый объект, унаследованный от Foo.prototype.
  2. Функция конструктора Foo вызывается с указанными аргументами и с этим привязывается к вновь созданному объекту. new Foo эквивалентен new Foo (), т.е. если список аргументов не указан, Foo вызывается без аргументов.
  3. Объект, возвращаемый функцией конструктора, становится результатом всего нового выражения. Если функция конструктора не возвращает явно объект, вместо него используется объект, созданный на шаге 1. (Обычно конструкторы не возвращают значение, но они могут сделать это, если хотят переопределить обычный процесс создания объекта.)

Явно возвращая f, вы переопределяете обычный процесс создания. Когда вы используете instanceof, вы спрашиваете «Is n и instance of f». Это не. Это это ф. Это не пример сам по себе.

Поскольку явно f является функцией, а n === f, оба вернут true, когда вы попытаетесь определить, являются ли они функциями. Кроме того, в Javascript сами функции являются объектами (как и массивы), поэтому new f() instanceof Object имеет значение true.

0 голосов
/ 02 сентября 2018

Возвращая f, вы возвращаете функцию, которая не является экземпляром f, потому что в ней отсутствует вызов с new.

function f() { return f; }
console.log(new f() === f);
...