Javascript 对象vs类vs函数
我想知道——JavaScript对象、类和函数之间有什么区别? 我认为类和函数是对象的类型,对吗 类和函数的区别是什么?或者它们真的是一样的东西,只是它们的术语根据它们的使用方式而变化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
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