Javascript 对象vs类vs函数

Javascript 对象vs类vs函数,javascript,class,oop,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

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

当然,类有方法和属性,可以实例化——但是,我也可以对任何旧函数进行实例化——或者不实例化?

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

函数func(){alert('foo');}//函数
-正确

func();//调用函数-警报“foo”
-正确

var func2=function(){alert('foo');}//肯定与'func'相同?
-Nope,
func2
是一个不同的对象,调用时显然做相同的事情

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


var c=newclass()
-调用存储在
类中的函数,将新的空对象作为
提供并返回该对象。名为
new function()
的函数应作为构造函数工作,并准备新创建的对象(
this
)。在您的例子中,构造函数对对象不做任何操作,只是提醒
bar

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

这里给出了一个很好的解释


另外,您还找到了一个非常好的参考资料,因为您现在一定已经知道JavaScript中没有类了。相反,JavaScript中的函数可以通过在函数调用之前加上
new
关键字,使其行为类似于构造函数。这就是我们所知道的

在JavaScript中,除了基本数据类型(布尔、数字和字符串)和未定义的
之外,所有内容都是对象。另一方面,
null
实际上是一个对象引用,即使您最初可能不这么认为。这就是为什么
typeof null
返回
“object”

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

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


阅读以下线程以了解有关JavaScript中原型继承的更多信息:

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

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

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

我希望通过ECMAScript 6,我们将在这些结构之间有清晰的分离,类似于我们在其他语言(如C#、Java等)中的分离。

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();
您可以像从其他语言中的对象期望的那样期望该对象的任何内容。只是为了实现它所做的努力,有点不同。你也应该看看


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

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'.
2015年更新 JavaScript中有一些类,它们在较旧的浏览器上没有使用:

它有构造函数、扩展等

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

ES6中的类也如下所示:

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

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

你应该澄清最后一句话。基于原型的编程不是“人们发现的模仿面向对象实践的方法”。它是面向对象编程的一种方式,早在JavaScript之前就发明了,是基于类编程的替代方案。非常感谢您的回答!我已经读过了,我想我现在明白了。所以你建议使用原型模式而不是构造函数模式?@SeanBone:我建议在学习构造函数模式之前先学习原型模式,因为这样更容易理解原型继承。但是,构造函数模式比JavaScript中的原型模式快。因此,如果您想编写性能关键的代码,那么使用构造函数模式更有意义。尽管如此,原型模式仍然非常快,您几乎不需要额外的性能提升。JavaScript解释器在优化代码方面做得很好。因此,在大多数情况下,您应该坚持原型模式。@bits恐怕您错了。您可以看到JavaScript中有两种类型的布尔值,数字和字符串-原语和包装对象。JavaScript中的文字值被视为原语。例如,文本
true
3.14
“Hello World!”
都是基本数据类型。在它们上使用
typeof
时,它们分别返回
“boolean”
“number”
“string”
。但是JavaSc