对象与类对比功能

Sea*_*one 59 javascript oop class

我想知道 - 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'
Run Code Online (Sandbox Code Playgroud)

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

Aad*_*hah 54

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

在JavaScript中,除了原始数据类型(布尔值,数字和字符串)和之外,一切都是对象undefined.另一方面null,实际上是一个对象参考,即使你可能首先相信.这就是typeof null回归的原因"object".

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

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

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

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

Neo*_*ptt 37

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.');
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为重要的是不要让新的类构造函数成为最新JavaScript的一部分,因此只支持它们,它们只是一种新的语法,它们实际上是函数,它们只是设计为语法糖,使代码更有条理什么不同的功能构造函数. (3认同)
  • 这些仍然不是经典继承意义上的"类",而只是用于连接与其他对象(OLOO)相关联的对象的语法糖,以便近似经典继承的行为.尽管关键字给你这种错觉,但JavaScript中没有类. (2认同)

lox*_*xxy 16

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
Run Code Online (Sandbox Code Playgroud)

现在当你创建它的对象时

var obj = new Animal();
Run Code Online (Sandbox Code Playgroud)

您可以像使用其他语言的对象一样期待此对象的任何内容.只是努力实现它,有点不同.您还应该在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'.
Run Code Online (Sandbox Code Playgroud)

  • 基于原型的编程不是“人们发现模仿面向对象实践的一种方式”。它是面向对象编程的一种方法,它是在JavaScript之前发明的,并且是基于类的编程的替代方法。 (2认同)

mis*_*hik 8

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.

  • 你应该澄清最后一句话. (3认同)

Tal*_*ala 6

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

这里给出了很好的解释3 way to Define a class in js

另外,找到了关于Javascript 中的 OOP的非常好的参考资料

  • @NikitaShahov——这只是 _如何在 javascript 中实现类_,并不意味着没有类。现在甚至连私人会员也即将成为一种现象。(这是第三阶段提案:https://github.com/tc39/proposal-private-methods) (3认同)

小智 6

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

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

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

  • @sorak不再是,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Method_definitions (2认同)