每个JavaScript对象都是函数吗?

时间:2011-08-10 21:24:10

标签: javascript function object

是否有一个不是函数的JavaScript对象?

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

x yzObject只是引用,在这种情况下,function Object(){ ... }也只是对{{1}的引用因为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()成为对象还是引用一个对象?那么Thingy怎么样?或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) 怎么办?区别是没有实际意义的。 “Everything”(或者它是?)是通过引用调用的,但是可以通过评估字符串来强制逐个调用。所以...)

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

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

甚至是一个对象数组

x=y=z=Object=null; alert([window.navigator.userAgent,Object,x,y,z].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(){       [本地代码]}

     

function Object(){       [本地代码]}

有许多物体不是物体。


正如其中一个comment所指出的,如果它被修改,对象可能不是它自己 危险!危险!威尔罗宾逊!

{{1}}

参考

4 个答案:

答案 0 :(得分:6)

您没有创建对象,您创建了对Object函数的引用。如果您希望这些是对象,您可以这样做:

x = y = z = {}

然后alert(x)将返回object [Object]

To(希望)包含注释 - 默认情况下Object是一个构造对象的函数。如果你重新分配名称Object(Firefox至少似乎允许我,没有测试过所有浏览器),那么Object将不再是一个函数,它将是你分配给它的任何东西。那么,答案是“不”,对象不是总是一个函数,但,除非它已被明确重新声明。据Firebug说:

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

貌似可以重新分配。我无法保证会产生什么样的影响,如果有的话。

答案 1 :(得分:2)

您正在将Object构造函数分配给变量x,y和z。 如果您改为说x=new Object(),则不会再将它们视为函数。

答案 2 :(得分:1)

任何函数都可以用作构造函数,通过在JavaScript中的函数名之前使用new运算符来创建对象。生成的对象不是Function

ObjectFunction之间也存在循环关系,可以通过以下方式进行测试:

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

答案 3 :(得分:0)

这是检查js中任何内容类型的万无一失的方法。

注意:你应该发送窗口以外的东西......

try it out here...

            (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));