JavaScript:如果“对象”是一个函数,它如何拥有方法?

时间:2015-11-14 21:46:46

标签: javascript

如果我检查Object对象的类型,它会显示“function”:

typeof Object === "function"

但我们都知道,Object有多种方法,例如:

Object.create();
Object.freeze();
Object.seal();
Object.getPrototypeOf();
...

(检查https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object

我的问题:这怎么可能?一个函数如何能够有方法?我一直认为,方法是一个函数,它是对象属性的值。

这里我们将它用作对象:

Object.freeze();

这里我们将它用作构造函数:

var myObj  = new Object();
var myObj2 = Object();

现在什么是“对象”?它似乎是:功能和对象。

这是一个特殊情况,因为这些(Object,Array,String,Number)是“本机构造函数”吗?

5 个答案:

答案 0 :(得分:4)

Function是Javascript中的一个对象,因此可以像函数一样被调用并且可以具有属性(例如方法)。

function f() {
    console.log("hello");
}

f.greeting = "goodbye";

f();                       // outputs "hello"
console.log(f.greeting);   // outputs "goodbye"

请注意,函数还具有内置属性和方法,例如.call().apply().length.prototype等...请参阅{的说明{3}}有关内置属性/方法的更多信息。

Object本身是一个构造函数,意思是这样使用:

var x = new Object();

虽然通常会使用对象文字语法来声明一个新对象:

var x = {};

作为构造函数,函数Object都可以作为构造函数调用(使用new),它可以拥有自己的属性/方法。

  

我的问题:这怎么可能?功能如何能够拥有   方法?我一直认为,方法是一种功能   对象属性的值。

这就是Javascript的设计方式。函数是对象,可以拥有自己的属性/方法。

  

这是一种特殊情况,因为它们(Object,Array,String,Number)是   “本土建设者”?

这不是特例。这适用于所有功能。正如我上面的代码示例所示,您可以定义自己的函数并为它们提供属性/方法。

答案 1 :(得分:2)

一个函数是一个数字是一个字符串是一个布尔值是一个数组是一个对象。

好吧,好吧,事情并非如此简单。但是函数是一个对象,并且可以像JavaScript中的每个其他对象一样具有属性:

ArrayAdapter

答案 2 :(得分:1)

函数的实例就像任何其他对象一样 - 它可以自由定义方法。

答案 3 :(得分:1)

  

怎么可能?

在JavaScript中,函数为first class objects。因此,函数对象可以具有属性和方法。

var a = new Object()?
  

现在什么是“对象”?

此处Object充当Constructor function,它将创建一个新对象。

答案 4 :(得分:1)

对象是“构造函数”函数。它与var obj = {};不同。 Typeof Object是函数,typeof obj是object。

在Javascript中,所有东西都是“对象”,可以有“属性”和“方法”。

试试这个例子:

function Class() {
    if (this === window) { 
        return new Class();
    }
}; 
// You create new 'type' Class (it's same with Object)
// You can invoke it (in browser) as function like Class();
// Or as a constructor like new Class();
// Or treat is as object - you can add properties
Class.getInstance = function() { return new Class(); }; // Here you add 'property' and its value is function
typeof Class === typeof Object; // true
Class.getInstance(); // You you function that calls your 'type' as 'constructor' (with new operator).

你是绝对正确的。函数是Object的特例,因此函数是同时的。它就像狗是狗和动物一样。

广告最后一点:在JavaScript中,一切都是对象,一些对象是特殊的 - 它们可以通过“调用”/“被调用”。这些是功能(他们是“一等公民”)。 Array,Number,...是“just”native-constructor-functions。