我在某处找到了以下代码,但我不能正确理解代码。
ArticleVote.submitVote('no');return false;
ArticleVote
是一个类,submitVote()
是该类的函数吗?
或者上面的代码是什么意思?在jQuery或传统的JavaScript中是否有类和对象的概念?如何创建它们?请分享一些参考链接或代码。
答案 0 :(得分:78)
与其他据称纯粹的OOP语言相反。函数也是对象,但它们也可以是对象的构造函数。
var ObjectCreator = function () {
};
以上是一个函数,如果适当调用,则创建一个对象。 正确调用意味着您必须使用new
运算符:
var obj = new ObjectCreator;
因此,虽然JavaScript本身没有类,但有方法可以模拟该行为。例如:
class Foo {
public void bar() {}
}
Foo foo = new Foo();
等同于以下JS代码:
var Foo = function () {
// constructor
};
Foo.prototype.bar = function () {}
var foo = new Foo;
当您想要使用继承时,真正的区别就在于它,这是一种不同类型的继承(原型)。所以,给定两个伪类Foo和Bar,如果我们希望Bar从Foo扩展,我们必须写:
var Foo = function () {};
var Bar = function () {};
Bar.prototype = new Foo; // this is the inheritance phase
var bar = new Bar;
alert(bar instanceof Foo);
虽然构造函数很有用,但有时候我们只需要只有一个该对象的实例。编写构造函数然后用属性和方法填充其原型是某种单调乏味的。所以JavaScript有对象文字,它们是某种哈希表,只是它们是自我意识的。 自我意识我的意思是他们知道this
关键字。对象文字是实现Singleton模式的好方法。
var john = {
age : 24,
isAdult : function () {
return this.age > 17;
}
};
以上,使用构造函数将等效于以下内容:
var Person = function (age) {
this.age = age;
};
Person.prototype.isAdult = function () {
return this.age > 17;
};
var john = new Person(24);
prototype
thingy 正如许多人所说,JavaScript对象继承自对象。这个东西有用,其中一个可以被称为寄生继承(如果我没记错道格拉斯福德提到这个的上下文)。无论如何,这个原型概念与原型链的概念有关,它类似于父 - >古典OO语言中的儿童链。所以,继承的东西。如果在bar
对象上调用foo
方法,但该对象没有bar
方法,则会启动成员查找阶段:
var Baz = function () {};
Baz.prototype.bar = function () {
alert(1);
};
var Foo = function () {};
Foo.prototype = new Baz;
var foo = new Foo;
/*
* Does foo.bar exist?
* - yes. Then execute it
* - no
* Does the prototype object of the constructor function have a bar
* property?
* - yes. Then execute it
* - no
* Is there a constructor function for the prototype object of
* the initial construct function? (in our case this is Baz)
* - yes. Then it must have a prototype. Lookup a bar
* member in that prototype object.
* - no. OK, we're giving up. Throw an error.
*/
foo.bar();
经典OO继承和基于原型的继承之间存在关键区别。当对象从对象继承时,它们也继承状态。举个例子:
var Person = function (smart) {
this.smart = smart;
};
var Adult = function (age) {
this.age = age;
};
Adult.prototype = new Person(true);
var john = new Adult(24);
alert(john.smart);
我们可以说john
是一个匿名人的寄生虫,因为它无情地吮吸了人的智慧。此外,鉴于上述定义,所有未来的成年人都会很聪明,但遗憾的是并非总是如此。但这并不意味着对象继承是一件坏事。只是一种工具,就像其他任何东西一样。我们必须按照我们认为合适的方式使用它。
在经典的OO继承中,我们不能做到以上。我们可以使用静态字段来模拟它。但这会使该类的所有实例对该字段具有相同的值。
答案 1 :(得分:12)
Javascript支持对象但不支持类 - 它使用prototype-based对象系统。
答案 2 :(得分:1)
答案 3 :(得分:1)
是的,JavaScript对面向对象的编程,对象和函数提供了令人印象深刻的支持。事实上,我很惊讶你必须提出这个问题!网上有大量资源,例如:
http://mckoss.com/jscript/object.htm
http://www.webreference.com/js/column79/
http://www.javascriptkit.com/javatutors/oopjs.shtml
更多资源: http://www.google.com/search?q=object+oriented+programming+javascript
如果没有JavaScript引擎中的这种支持,就无法构建jQuery和Prototype等JavaScript框架。
答案 4 :(得分:1)
当然JS有对象和类,但它不完全是传统方法。
这是一个相当广泛的问题,但是你想知道关于JS中的对象和类的三个主要内容:
1)。一切都是一个对象 - 这个着名的包括JS的第一类函数
2)。有对象文字
var myObject = { "foo": 123, "bar": [4,5,6] };
3)。继承是基于原型的,因此创建类更多的是形式而非功能。为了得到一个类的效果,你可以编写类似的东西:
function myClass(foo)
{
this.foo = foo;
}
myClass.prototype.myFooMethod = function() {alert(this.foo);}
var myInstance = new myClass(123);
myinstance.myFooMethod(); // alerts 123
对于您的示例,ArticleVote可能是一个对象实例,可能在概念上不是一个类,submitVote可能是该对象的一个方法。虽然无法确定,但它可能就是你用另一种语言称之为静态方法。
答案 5 :(得分:0)
你可以通过Javascript实现上述目标,与jQuery无关。
var ArticleVote= {};
ArticleVote.submitVote = function(voteResult) {
console.log(voteResult);
}
function Vote(){
ArticleVote.submitVote('no');
return false;
}
答案 6 :(得分:0)
您可以将JavaScript函数用作类。
ClassUtil = function(param){
privateFunction = function(param){
// Do some thing
return valueParam;
}
this.publicFunction = function(){
var val1 = function1();
if (val1){
return true;
} else{
return false;
}
}
}
function getClass(){
var classUtil = new ClassUtil();
alert(classUtil.publicFunction());
}
有一个公共功能和一个私人功能。你可以使用类的对象从外面调用公共函数。