对象和功能非常混乱

时间:2010-01-04 23:49:48

标签: javascript

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

所以如果Function是一个Object而Object是一个函数怎么来

Function === ObjectFunction == Object是假的?

我明白检查对象的实例与比较不一样。所以这里的问题是如果两个对象(实际上是类型)是彼此的实例的情况下的模糊性,那么类型不应该相同吗?

注意:Object不是Number或Array的实例,只是Function的一个实例。

7 个答案:

答案 0 :(得分:17)

来自JavaScript Prototypal Inheritance

  

在JavaScript中,所有东西都继承自Object。我们可以说   Object是超级构造函数的超类,或更好的   每个变量,并且一切都是Object的实例。物体   构造函数是一个Function,但Function是一个Objectof的实例。   这意味着这些断言总是正确的:

     

(Object instanceof Function) === (Function instanceof Object)

     

上面的例子是正确的,因为Object是一个构造函数,JavaScript中的构造函数总是一个Function。在同一个   时间,每个功能都有自己的原型,总是原型   从Object.prototype开始继承。功能   构造函数,是一个函数本身,而函数原型是一个   函数(){};

     

(Function.prototype instanceof Object) === (function(){} instanceof Object)

答案 1 :(得分:5)

JavaScript中的所有内容都是Object,因为JavaScript是一种面向对象的语言。 FunctionObject的一个实例,因为所有内容都是Object的实例。很简单。但是,初始化其他对象(构造函数)的对象在JavaScript中也是Function,因此Object也可以是Function

想一想:

var obj = new Object();
在这种情况下,

Object用作Function,不是吗?因此,虽然理论上Object应该是语言中最低级别的对象,但JavaScript不能在没有Function s(双关语!)的情况下运行,因此您需要两者都处于同一级别。 Object需要是Function的实例,因为它是构造函数,需要创建更多自身实例。

function FooBar() {}

上面的FooBar类是ObjectFunction的实例,因为它们都是。{相同的逻辑适用于内置的ObjectFunction对象;他们是两者的例子。

P,很困惑。这有什么意义吗?

答案 2 :(得分:4)

我认为这更多是由于定义对象的独特方式。你没有在javascript中定义一个类型,你定义了一个构造函数。但是你也没有将构造函数定义为构造函数,它只是一个函数。

然后,您可以通过其构造函数的名称来引用类型....这只是一个函数。

function Tiger(){ //function, or object?
}

function Apple(){ //function, or object?
}

两个都可以成为对象,或者只是函数。只有您使用它们的方式才能确定。所以有点是有意义的,在较低的层次上,对象是函数,函数是对象,但仍然存在差异,对吧?

答案 3 :(得分:1)

Javascript中没有类这样的东西。函数调用instanceof运算符。

Object是“对象对象”的构造函数(是的,这是官方术语),Function是“函数对象”的构造函数。

因此,当您调用Function instanceof Object时,它会返回true,因为Function是一个函数,因此是一个对象等。这并不意味着类型是相同的,因为对象和函数有不同的原型:

Object.prototype
   ^
   | inherits from
   |                instance
Function.prototype  <-------  Object, Function

答案 4 :(得分:0)

 javascript:alert([ window.navigator.userAgent, 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() {
    [native code]
}

参考:Is every JavaScript Object a function?

答案 5 :(得分:0)

假设

&lt; ----:指向(通过.__proto__

的链接

&lt; - :继承了(通过.

的属性

然后

Function.prototype&lt; ---- {Object,Function}

对象&lt; ---- Function.prototype

Object.prototype&lt; - Object

console.log(Object.prototype.constructor === Object); // true!

Object.prototype 链接到任何内容;它没有__proto__属性。

答案 6 :(得分:-2)

instanceof运算符指示第一个参数是否属于给定类型。那就是说

 A instanceof B
如果A是类型B的实例,则

返回true。

另一方面,==和===运算符是比较运算符。他们比较了相等的价值。

例如,你可以说杰克instanceof男孩是真的,但你会说杰克==男孩?否。