Является ли каждый объект JavaScript функцией? - PullRequest
5 голосов
/ 11 августа 2011

Есть ли объект JavaScript, который не является функцией?

javascript: x=y=z=Object; alert([window.navigator.userAgent,x,y,z].join("\n\n"))

(Был комментарий , что x, y, z являются просто ссылками вэтот случай Object также является просто ссылкой на function Object(){ ... }, потому что значение Object присвоено x, и они являются "одинаковыми". Как и "доказательство"

javascript:x=Object;x.p=43;alert([x==Object,x===Object,x.p,Object.p])

отображает

true,true,43,43

Учитывая function Thing(){} делает x=new Thing() делает x объектом или ссылкой на него? Как насчет new Thing() и Thing? Или y в y=x=new Thing() или y=x=Thing«Что делать, если Thing=function(){}?» Различие является спорным. «Все» (или оно?) Вызывается по ссылке, но вызов по имени может быть приведен в исполнение путем вычисления строк. Итак ...)

javascript:
    void function(x,y,z){
        alert(  [window.navigator.userAgent,x,y,z].join("\n\n") )
    }(Object,Object,Object)

или

javascript:
    void function(x){  (function (y){  (function (z){
             alert(  [window.navigator.userAgent,x,y,z].join("\n\n") )
         })(y) })(x) }(Object)

(ну, не совсем спорный - значения function должны быть приведены с помощью (...) или void. Нюансы (...) тонкие:

javascript:       /* 43.p gives a runtime error but not ... */
    alert([ (43).p=34, 43["q"]=17, (x=43).z="hmmm" ]); 
    alert([ 43["p"], (43).z, x.p, x["z"], x]);

отображает 34,17,hmmm и ,,,,43

)

или даже массив объектов

javascript:alert([window.navigator.userAgent,Object,Object,Object].join("\n\n"))

дает:

Mozilla / 5.0 (X11; U; Linux i686; en-US; rv: 1.9.2.3) Gecko / 20100423 Ubuntu / 10.04 (lucid) Firefox / 3.6.3

function Object () {[собственный код]}

function Object () {[собственный код]}

functionObject () {[собственный код]}

Есть много объектов, которые не являются объектами.


Как указано в одном из ответов , Объект не может быть сам по себе, ЕСЛИ он изменен.
Опасно!Опасность!Уилл Робинсон!

x=y=z=Object=null; alert([window.navigator.userAgent,Object,x,y,z].join("\n\n"));

ссылки

Ответы [ 4 ]

6 голосов
/ 11 августа 2011

Вы не создавали объекты, вы создали ссылки на функцию Object.Если вы хотите, чтобы это были объекты, вы можете сделать это:

x = y = z = {}

Тогда alert(x) вернет object [Object].

Чтобы (надеюсь) охватить комментарии - по умолчанию Objectэто функция, которая конструирует объектыЕсли вы переназначаете имя Object (Firefox, по крайней мере, мне это позволяет, не проверяли все браузеры), тогда Object больше не будет функцией, а будет тем, что вы ей назначили.Итак, ответ «нет», объект не является всегда функцией, но должен быть, если он не был явно повторно объявлен.Согласно Firebug:

>>> Object
Object()
>>> Object = {}
Object {}
>>> Object
Object {}

По-видимому, его можно переназначить.Я не могу поручиться за то, какие последствия это имело бы, если таковые имеются.

2 голосов
/ 11 августа 2011

Вы назначаете конструктор Object для переменных x, y и z. Если вместо этого вы скажете x=new Object(), вы больше не увидите их как функции.

1 голос
/ 11 августа 2011

Любую функцию можно использовать в качестве конструктора для создания объекта с помощью оператора new перед именем функции в JavaScript.Полученный объект не будет Function.

Существует также круговая взаимосвязь между Object и Function, которую можно проверить с помощью:

Object instanceof Function // true
Function instanceof Object // true

И {} и Object не совпадают, но {} и new Object() являются.

function foo() {}
foo instanceof Function // true
foo instanceof Object // true

var bar = new foo();
bar instanceof Function // false
bar instanceof Object // true

var baz = {};
baz instanceof Function; // false
baz instanceof Object; // true
0 голосов
/ 11 августа 2011

Вот верный способ проверить тип чего-либо в js.

примечание: вы должны отправить что-то кроме окна ...

попробуйте здесь ...

            (function (self) {
                var values = [
                          'Function',
                          'Object',
                          'Array',
                          'String',
                          'Number',
                          'Date',
                          'RegExp',
                          'Boolean',
                          'Null',
                          'Error'
                     ];

                for (var i in values) if (values.hasOwnProperty(i)) {
                     var value = values[i];

                     self['is' + value] = (function (v) {
                          return function (o) {
                                 var r = '';

                                 try {
                                     r = (o === null) ?
                                              'Null' :
                                              Object.prototype.toString.call(o).replace(/^\[object\s(\w+)\]$/, '$1');
                                 } catch (e) {
                                     r = 'Undefined';
                                 }

                                 return !!(r === v);
                          };
                     })(value);
                }
           })(window);

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