我想知道 - 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中没有类。相反,通过使用new
关键字进行函数调用,可以使JavaScript中的函数表现得像构造函数。这被称为constructor pattern。
在JavaScript中,除了原始数据类型(布尔值,数字和字符串)和undefined
之外,一切都是对象。另一方面,null
实际上是一个对象参考,即使你可能首先相信。这就是typeof null
返回"object"
的原因。
JavaScript中的函数类似于Lua中的functable(即它们是可调用对象)。因此,可以使用函数来代替对象。类似地,数组也是JavaScript中的对象。另一方面,对象可以被认为是关联数组。
然而,最重要的一点是JavaScript中没有类,因为JavaScript是一种原型面向对象的语言。这意味着JavaScript中的对象直接从其他对象继承。因此我们不需要课程。我们所需要的只是一种创建和扩展对象的方法。
阅读以下主题以了解有关JavaScript中原型继承的更多信息:Benefits of prototypal inheritance over classical?
在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.');
}
}
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'.
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
。
javascript中没有类。但是,有一些方法可以使函数像其他语言中的类一样运行。
这里给出了一个很好的解释3 way to define a class in js
此外,为OOP in Javascript找到了一个非常好的参考
Object是JavaScript中的基类型,即所有用户定义的数据类型都以某种方式从Object继承。因此,如果你定义一个函数或类[注意到现在JS不支持类构造,但它在ECMAScript版本6中提出],它将隐式继承自Object类型。
类实际上用于将逻辑函数和属性封装到一个类型/实体中,您可以使用构造函数语法“新建”它。因此,如果定义“Customer”类,则可以多次实例化它,并且每个实例/对象可以具有不同的值。如果使用原型定义类级别值,它们甚至可以共享值。
由于JS目前不支持类构造,因此函数可以作为单独的方法以及其他函数或类型的容器。
我希望通过ECMAScript 6,我们可以清楚地分离这些结构,类似于我们在C#,Java等其他语言中的结构。
您还可以在ES6中获得如下所示的课程:
//class
class Cat {
//constructor
constructor() {
this.name = 'Snowball';
}
//method
meow() {
console.log('Hello, nyah! My name is ' + this.name + ' nyah!~');
}
};