jQuery或JavaScript是否具有类和对象的概念?

时间:2009-07-02 11:35:38

标签: javascript jquery html class

我在某处找到了以下代码,但我不能正确理解代码。

ArticleVote.submitVote('no');return false;

ArticleVote是一个类,submitVote()是该类的函数吗?

或者上面的代码是什么意思?在jQuery或传统的JavaScript中是否有类和对象的概念?如何创建它们?请分享一些参考链接或代码。

7 个答案:

答案 0 :(得分:78)

一切都是JavaScript中的对象

与其他据称纯粹的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());    
}

有一个公共功能和一个私人功能。你可以使用类的对象从外面调用公共函数。