【问题标题】:Is every JavaScript Object a function?每个 JavaScript 对象都是函数吗?
【发布时间】:2011-10-24 11:38:45
【问题描述】:

是否存在不是函数的 JavaScript 对象?

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

(有一个comment 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

函数对象(){ [本机代码] }

函数对象(){ [本机代码] }

函数对象(){ [本机代码] }

有很多对象不是Object。


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

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

参考资料

【问题讨论】:

  • @Ibu ...但并非所有对象都是函数 ;-)
  • @pst,谢谢你完成我的句子
  • 但是...所有非文字对象都是函数实例化-
  • Objectfunction Object() { [native code] } 通过javascript:alert(Object) 等等...

标签: javascript function object


【解决方案1】:

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

x = y = z = {}

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

(希望)包含 cmets - 默认情况下,Object 是一个构造对象的函数。如果您重新分配名称 Object(至少 Firefox 似乎允许我这样做,尚未测试所有浏览器),那么 Object 将不再是一个函数,它将是您分配给它的任何内容。那么,答案是“不”,Object 不是总是 一个函数,而是 应该 除非它被明确地重新声明。根据萤火虫:

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

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

【讨论】:

  • 击败我......然而,我不喜欢在谈论 JavaScript 时使用“引用”(这是我关于如何阅读/表达第一句话的建议):你没有创建 [new] 对象,您将 function 对象 [这是一个构造函数] 分配给变量。
  • 这也是一个很好的表达方式,当然。关键是您可以创建不是函数的对象,但不能通过将对象函数分配给变量来创建。 :)
  • 是的,是的......但是......是否存在不是函数的对象。注意仔细的措辞和句法。大写的“对象”,没有冠词“an”。我的意思是“对象”实体。是否有一个(对象)不是函数!?问题不在于创建对象。
  • @ekim - 当 JS 解释器加载 Object 时,是 Object Function(它是 New Object Constructor)。您可以调用 Object = {} 将其转换为实际的 Object Literal,但这消除了调用 new Object() 的能力,因为您已经覆盖了之前的签名。我......我不确定我是否理解你为什么以你的方式提问。
  • xyz 是对象-(尽管是同一个)-它们是(一个也是唯一的)对象对象,它是函数类型的对象,或者只是一个功能。
【解决方案2】:

您正在将 Object 构造函数分配给变量 x、y 和 z。 如果您改为使用 x=new Object(),您将不再看到它们被称为函数。

【讨论】:

【解决方案3】:

这是检查 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));

【讨论】:

  • 这个问题不需要检查类型 - 它询问“对象总是一个函数吗?”
  • 是的,但javascript: alert([Object, typeof(Object)]) 更基础
【解决方案4】:

任何函数都可以用作构造函数来创建对象,方法是在 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

【讨论】:

  • 不存在“循环关系”。 Object 和 Function 都是函数,它们都继承自 Function.prototype,而 Function.prototype 又继承自 Object.prototype(所以它们都是函数,所有 javascript 函数也是对象)。 instanceOf 操作符只是检查原型链,它并不能告诉你太多。
  • 所以......简单的答案是......这是一个“是”吗?每个对象(即使只有一个我知道但有这个)都是一个函数!跨度>
  • "任何函数..用作构造函数来使用new运算符创建对象...不会是Function"不正确,证明:javascript:function f(){return function(){}};alert(new f)跨度>
  • 其实有一个递归循环关系,它是基于对象和函数的构造器机制很好地定义的,其中Function和Object都是代表的。考虑一下,javascript:with(Object)alert([Object,constructor,prototype.constructor ]) 的详细信息在chat.stackoverflow.com/rooms/2245/… 中提供
猜你喜欢
  • 1970-01-01
  • 2011-03-27
  • 1970-01-01
  • 2015-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多