我想知道 - 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'
当然,类有方法和属性,可以实例化 - 但是,我可以对任何旧函数做同样的事情 - 或者不是吗?
答案 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)
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.');
}
}
答案 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!~');
}
};