对象与类对比功能

时间:2013-07-08 11:25:32

标签: javascript class oop

我想知道 - 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'

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

7 个答案:

答案 0 :(得分:47)

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

在JavaScript中,除了原始数据类型(布尔值,数字和字符串)和undefined之外,一切都是对象。另一方面null实际上是一个对象引用,即使你可能起初不相信。这是typeof null返回"object"的原因。

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

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

阅读以下主题以了解有关JavaScript中原型继承的更多信息:Benefits of prototypal inheritance over classical?

答案 1 :(得分:29)

更新2015

javascript中有一些类,它们只是在旧浏览器中不使用。 enter image description here

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.');
  }
}

答案 2 :(得分:14)

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();

您可以从其他语言的对象中获得此对象的任何内容。只是努力实现它,有点不同。您还应该查看inheritance in 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'.

答案 3 :(得分:7)

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并返回该对象。调用为new functionA()的函数应该作为构造函数工作并准备新创建的对象(this)。在您的情况下 - 构造函数不对该对象执行任何操作,只提醒bar

答案 4 :(得分:3)

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

这里给出了一个非常好的解释3 way to define a class in js

另外,找到了OOP in Javascript

的非常好的参考资料

答案 5 :(得分:2)

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

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

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

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

答案 6 :(得分:1)

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

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

    //method
    meow() {
        console.log('Hello, nyah! My name is ' + this.name + ' nyah!~');
    }
};