почему ** (Object .__ proto__ instanceof Function) ** === false? - PullRequest
3 голосов
/ 11 мая 2011

почему Object ._ proto _ instanceof Функция дает мне false?

alert(Object.__proto__ ); //  clearly Object.__proto__ is a function right?
alert(typeof Object.__proto__); // clearly Object.__proto__ is a function right?
alert(Object.__proto__ instanceof Function); // !

Ответы [ 4 ]

4 голосов
/ 11 мая 2011

Не все функции создаются с помощью конструктора Function.instanceof специально проверяет, был ли данный элемент создан с помощью этой конкретной функции .

Вы получаете аналогичный эффект в браузерных средах при работе с несколькими окнами.Я имею в виду, если у вас есть функция foo в окне A:

function foo(arg) {
    if (arg instanceof Array) {
        // It's an array, do something
    }
}

... и у вас есть код в другом окне B, которое вызывает ее:

opener.foo([]);

... тогда вы ожидаете, что foo поймет, что arg - это массив, верно?Но это не так, потому что, хотя arg является массивом, он не был создан конструктором Array в окне, в котором находится foo.

Подробнее овыяснить, что здесь есть: Скажите, что?

Если вы очарованы этим (как вам кажется), нет ничего лучше чтения спецификация .Да, проза ... сухая ... и терминология ... плотная ... но она становится все более и более интересной по мере того, как вы все больше и больше узнаете об основных принципах работы.


Не по теме : помните, что __proto__ не является стандартным и поддерживается не всеми реализациями JavaScript.

3 голосов
/ 12 мая 2011

Чтобы покончить с тайной:

Что такое Object.__proto__?

  • Это просто ссылка на объект Function.prototype.

    Object.__proto__ === Function.prototype; // true
    

Конструктор Object как почти всех встроенных и пользовательских функций, наследуемых от Function.prototype.

Этот объект (Function.prototype) описан в спецификации как Функциональный объект , но, очевидно, объект не может наследовать от себя и именно поэтому он наследуется от Object.protoype.

Ваш тест:

Object.__proto__ instanceof Function;   // false, which is equivalent to:
Function.prototype instanceof Function; // false

просто говорит нам, что Function.prototype объект не в цепочке прототипов самого Function.prototype:

Function.prototype.isPrototypeOf(Function.prototype); // false, equivalent to:
Object.prototype.isPrototypeOf.call(Function.prototype, Function.prototype);

Как я уже говорил, в спецификации этот объект описан со следующими характеристиками, если вы заинтересованы:

  • Это функциональный объект (реализует внутренний метод [[Call]]).

    typeof Function.prototype; // "function"
    
  • Значение его внутреннего свойства [[Class]] равно "Function".

    Object.prototype.toString.call(Function.prototype); // "[object Function]"
    
  • Значение его внутреннего свойства [[Prototype]] указывает на Object.prototype (как вы теперь знаете).

    Object.prototype.isPrototypeOf(Function.prototype); // true
    
  • Может вызываться с любым количеством аргументов.

  • Всегда возвращает значение undefined.

  • Свойство length равно 0.

  • Начальное значение внутреннего свойства [[Extensible]]: true.

2 голосов
/ 11 мая 2011
alert(Object.__proto__ ); //  clearly Object.__proto__ is a function right?
alert(typeof Object.__proto__); // clearly Object.__proto__ is a function right?
alert(Object.__proto__ instanceof Function); // !

Точно, это функция. Однако это не функция объект . Вот почему instanceof возвращает false. Вы можете прочитать все об instanceof здесь .

0 голосов
/ 11 мая 2011

изображение в этом посте поможет вам понять связь между функцией и объектом

Структура объекта JavaScript

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...