繁体   English   中英

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

[英]JavaScript: if “Object” is a function, how it can have methods?

如果我检查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)是“本机构造函数”吗?

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

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

f.greeting = "goodbye";

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

请注意,功能也都有内置的属性和方法,如.call() .apply().length.prototype等...看到的描述上MDN功能对象以获得更多信息的内置特性/方法。

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

var x = new Object();

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

var x = {};

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

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

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

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

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

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

好吧,这并不是那么简单。 但是函数是一个对象,并且可以像JavaScript中的每个其他对象一样具有属性:

var a = function() { return 10; };
a.foo = function() { return 20; };
console.log(a());     // 10
console.log(a.foo()); // 20

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

怎么可能?

在JavaScript中,函数是第一类对象 因此,函数对象可以具有属性和方法。

var a = new Object()?

现在什么是“对象”?

这里Object充当构造函数 ,它将创建一个新对象。

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

在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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM