对象 vs 类 vs 函数

IT技术 javascript class oop
2021-03-13 23:30:14

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

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

6个回答

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

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

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

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

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

null 是一个原始值。
2021-04-19 23:30:14
null 是原始值之一。它不是一个对象。typeof null === "object" 只是近二十年来JS中的一个bug。
2021-04-28 23:30:14
是的@DhavalJardosh
2021-05-03 23:30:14
这个答案现在已经过时了
2021-05-13 23:30:14
@bits 恐怕你错了。您会看到 JavaScript 中有两种类型的布尔值、数字和字符串 - 基元和包装对象。JavaScript 中的文字值被视为原语。例如,文字true,3.14"Hello World!"都是原始数据类型。当您使用typeof上他们,他们返回"boolean""number""string"分别。然而,JavaScript 允许您将它们用作对象,并在需要时将它们强制转换为对象。因此你可以做类似的事情"abc".slice(-1)这就是我们valueOf在 JavaScript 中使用运算符的原因
2021-05-15 23:30:14

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.');
  }
}
这些仍然不是经典继承意义上的“类”,而只是用于以近似经典继承行为的方式将链接到其他对象 (OLOO) 的对象连接起来的语法糖。尽管关键字给了你这种错觉,但 JavaScript 中没有类。
2021-05-03 23:30:14
我认为重要的是,新的类构造函数不是最新的 JavaScript 的一部分,因此仅受支持,它们只是一种新语法,它们实际上是函数,它们只是被设计为语法糖,以使代码更有条理。与函数构造函数没有任何不同。
2021-05-16 23:30: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();

您可以像从其他语言的对象中一样期待此对象的任何内容。只是努力实现它,有点不同。您还应该查看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'.
基于原型的编程不是“人们发现的一种模拟面向对象实践的方式”。面向对象编程的一种方式,早在 JavaScript 之前就发明了,并且是基于类的编程的替代方案。
2021-05-15 23:30:14

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

你应该澄清最后一句话。
2021-04-22 23:30:14

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

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

    //method
    meow() {
        console.log('Hello, nyah! My name is ' + this.name + ' nyah!~');
    }
};
那个方法需要一个“函数”,不是吗?
2021-04-26 23:30:14
2021-04-29 23:30:14