97

我想知道 - JavaScript 对象、类和函数之间有什么区别?我认为类和函数是对象的类型是否正确?

类和函数的区别是什么?还是它们真的是一回事,只是它们的术语会根据它们的使用方式而变化?

function func() { alert('foo'); } // a function
func(); // call the function - alerts 'foo'
var func2 = function () { alert('hello'); } // acts the same way as 'func' surely?
func2(); // alerts 'hello'

var Class = function() { alert('bar'); }; // a class
var c = new Class(); // an istance of a class - alerts 'bar'

当然,类有方法和属性并且可以被实例化——但是,我可以对任何旧函数做同样的事情——或者不是?

4

7 回答 7

88

正如您现在必须知道的那样,JavaScript 中没有类。相反,通过在函数调用前加上new关键字,可以使 JavaScript 中的函数表现得像构造函数。这称为构造函数模式

在 JavaScript 中,除了原始数据类型(布尔、数字和字符串)和undefined. 另一方面null,它实际上是一个对象引用,尽管您起初可能不这么认为。这就是typeof null退货的原因"object"

JavaScript 中的函数类似于 Lua 中的 functables(即它们是可调用对象)。因此,可以使用函数代替对象。同样,数组也是 JavaScript 中的对象。另一方面,对象可以被认为是关联数组。

然而,最重要的一点是 JavaScript 中没有类,因为 JavaScript 是一种原型面向对象的语言。这意味着 JavaScript 中的对象直接继承自其他对象。因此我们不需要类。我们所需要的只是一种创建和扩展对象的方法。

阅读以下主题以了解有关 JavaScript 中原型继承的更多信息:原型继承优于经典继承的好处?

于 2013-07-08T11:43:41.667 回答
49

2015 年更新

JavaScript中有一些类,它们只是在旧浏览器上没有使用:

兼容性截图

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes

它有构造函数、扩展等。

class Cat { 
  constructor(name) {
    this.name = name;
  }
  
  speak() {
    console.log(this.name + ' makes a noise.');
  }
}

class Lion extends Cat {
  speak() {
    super.speak();
    console.log(this.name + ' roars.');
  }
}
于 2015-12-21T17:20:38.640 回答
24

JS中的一个类:

function Animal(){  

    // Private property
    var alive=true;

    // Private method
    function fight(){ //... }   

    // Public method which can access private variables
    this.isAlive = function() { return alive; } 

    // Public property
    this.name = "Joe";
}

// Public method
Animal.prototype.play = function() { alert("Bow wow!"); }

// .. and so on

现在当你创建它的对象

var obj = new Animal();

你可以期待这个对象的任何东西,就像你对其他语言的对象一样。只是实现它的努力,有点不同。您还应该查看JS 中的继承


回到你的问题,我将其改写为:

Class  : A representation of a set with common properties.
object : One from the set with the same properties.


var Class = function() {alert('bar');}; // A set of function which alert 'bar'
var object = new Class();               // One of the functions who alert's 'bar'.
于 2013-07-08T11:58:01.133 回答
12

JavaScript 没有类,函数实际上是 JavaScript 中的对象(一等公民)。函数对象的唯一区别是它们是可调用的。

function func() { alert('foo'); } // a function- 正确的

func(); // call the function - alerts 'foo'- 正确的

var func2 = function () { alert('foo'); } // same as 'func' surely?- 不,func2是一个不同的对象,它在调用时显然做同样的事情。

var Class = function() { alert('bar'); };- 这是一个没有名称存储在变量中的函数Class

var c = new Class();- 调用存储在Class提供新的空对象this并返回该对象中的函数。调用 asnew functionA()的函数应作为构造函数工作并准备新创建的对象 ( this)。在您的情况下,构造函数对对象不执行任何操作,只是发出警报bar

于 2013-07-08T11:26:37.000 回答
6

您还可以在 ES6 中获得如下所示的类:

//class
class Cat {
    //constructor
    constructor() {
        this.name = 'Snowball';
    }

    //method
    meow() {
        console.log('Hello, nyah! My name is ' + this.name + ' nyah!~');
    }
};
于 2018-03-05T15:25:14.000 回答
4

javascript中没有类。但是,有一些方法可以使函数表现得像其他语言中的类。

这里给出了很好的解释js 中定义类的 3 种方式

此外,在 Javascript 中找到了一个非常好的OOP参考

于 2013-07-08T11:31:24.497 回答
3

Object 是 JavaScript 中的基本类型,即所有用户定义的数据类型都以一种或另一种方式从 Object 继承。所以如果你定义了一个函数或一个类[注意目前 JS 不支持类构造,但它在 ECMAScript 版本 6 中提出],它将隐式继承自 Object 类型。

类实际上用于将逻辑函数和属性封装到一种类型/实体中,您可以使用构造函数语法“新建”它。因此,如果您定义一个“客户”类,您可以多次实例化它,并且每个实例/对象可以有不同的值。如果您使用原型定义类级别的值,它们甚至可以共享这些值。

由于 JS 目前不支持类构造,因此函数实际上可以充当单独的方法以及其他函数或类型的容器。

我希望在 ECMAScript 6 中,我们可以清楚地区分这些结构,类似于我们在 C#、Java 等其他语言中的结构。

于 2013-07-08T11:44:12.013 回答