Czy jQuery lub JavaScript mają pojęcie klas i obiektów?

Znalazłem gdzieś następujący kod, ale nie rozumiem go właściwie.

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

Czy ArticleVote jest klasą, A submitVote() funkcją tej klasy?

Lub co oznacza powyższy kod? A czy jest jakaś koncepcja klas i obiektów w jQuery lub w tradycyjnym JavaScript? Jak je tworzyć? Proszę udostępnić linki referencyjne lub kod.

Author: Peter Mortensen, 2009-07-02

7 answers

Wszystko jest obiektem w JavaScript

W przeciwieństwie do innych rzekomo czystych języków OOP. Funkcje też są obiektami, ale równie dobrze mogą być konstruktorami obiektów.

var ObjectCreator = function () {
};

Powyższa funkcja jest funkcją, która po odpowiednim wywołaniu tworzy obiekt. nazwane odpowiednio oznacza, że należy użyć operatora new:

var obj = new ObjectCreator;

Więc chociaż JavaScript nie ma klas per se, ma środki do naśladowania tego zachowania. Na przykład:

class Foo {
    public void bar() {}
}

Foo foo = new Foo();

Odpowiada Następującemu kodowi JS:

var Foo = function () {
    // constructor
};

Foo.prototype.bar = function () {}

var foo = new Foo;

Dziedziczenie jest INNE

Prawdziwa różnica pojawia się, gdy chcesz użyć dziedziczenia, który jest innym typem dziedziczenia (prototypowym). Tak więc, biorąc pod uwagę dwie pseudoklasy Foo i Bar, jeśli chcemy, aby Bar rozszerzał się z Foo, musimy napisać: {]}

var Foo = function () {};
var Bar = function () {};

Bar.prototype = new Foo; // this is the inheritance phase

var bar = new Bar;

alert(bar instanceof Foo);

Literały obiektów

Podczas gdy funkcje konstruktora są użyteczne, czasami potrzebujemy tylko tylko jednej instancji ten obiekt. Pisanie funkcji konstruktora, a następnie wypełnianie jej prototypu właściwościami i metodami jest w jakiś sposób żmudne. Tak więc JavaScript ma literały obiektów, które są pewnego rodzaju tabel hash, tyle że są świadome siebie. Przez świadome siebie mam na myśli, że wiedzą o słowie kluczowym this. Literały obiektowe to świetny sposób na implementację wzorca Singletona.

var john = {
    age : 24,

    isAdult : function () {
        return this.age > 17;
    }
};

Powyższe użycie funkcji konstruktora byłoby równoważne z następującym:

var Person = function (age) {
    this.age = age;
};

Person.prototype.isAdult = function () {
    return this.age > 17;
};

var john = new Person(24);

Co o tym prototype czymś

Jak wielu już powiedziało, w JavaScript obiekty dziedziczą po obiektach. Ta rzecz ma użyteczne aspekty, z których jeden można nazwać, dziedziczenie pasożytnicze (jeśli dobrze pamiętam kontekst, w którym Douglas Crockford wspomniał o tym). W każdym razie, ta koncepcja prototypu jest związana z koncepcją prototype chain, która jest podobna do łańcucha parent -> child w klasycznych językach OO. Sprawy spadkowe. Jeśli wywołana jest metoda bar na obiekcie foo, ale ten obiekt nie ma metody bar, rozpoczyna się faza wyszukiwania członka:

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();
Czekaj, mówiłeś coś o pasożytniczym dziedziczeniu.]}

Istnieje zasadnicza różnica między dziedziczeniem klasycznym OO A dziedziczeniem opartym na prototypie. Gdy obiekty dziedziczą po obiektach, również dziedziczą stan. Weźmy ten przykład:

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);

Można powiedzieć, że john jest pasożytem anonimowej osoby, ponieważ bezlitośnie wysysa osobę inteligencja. Ponadto, biorąc pod uwagę powyższą definicję, wszyscy przyszli dorośli będą inteligentni, co niestety nie zawsze jest prawdą. Ale to nie znaczy, że dziedziczenie przedmiotów jest złe. To tylko narzędzie, jak Wszystko inne. Musimy go używać tak, jak uznamy za stosowne.

W klasycznym dziedziczeniu OO nie możemy wykonać powyższego. Możemy go emulować używając pól statycznych. Ale to sprawi, że wszystkie instancje tej klasy będą miały taką samą wartość dla tego pola.

 78
Author: Ionuț G. Stan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-16 10:23:01

Javascript obsługuje obiekty ale nie Klasy - używa prototype-based system obiektowy.

 12
Author: Greg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-02 11:41:18
 1
Author: rahul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-20 04:41:57

Z pewnością JS ma obiekty i klasy, ale nie jest to do końca konwencjonalne podejście.

To dość szerokie pytanie, ale są trzy główne rzeczy, które chcesz wiedzieć o obiektach i klasach w JS:

1). Wszystko jest obiektem-ten słynny zawiera funkcje pierwszej klasy JS

2). Istnieją literały obiektów

var myObject = { "foo": 123, "bar": [4,5,6] };

3). Dziedziczenie jest oparte na prototypach, więc tworzenie klas jest bardziej kwestią formy niż funkcji. Aby uzyskać efekt klasy piszesz coś w stylu:

function myClass(foo)
{
  this.foo = foo;
}
myClass.prototype.myFooMethod = function() {alert(this.foo);}

var myInstance = new myClass(123);

myinstance.myFooMethod(); // alerts 123

Dla Twojego przykładu jest prawdopodobne, że ArticleVote jest instancją obiektu, a prawdopodobnie nie koncepcyjnie klasą, A submitVote byłaby metodą obiektu. nie mogę jednak powiedzieć na pewno, że może to być coś, co można nazwać metodą statyczną w innym języku.

 1
Author: annakata,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-02 11:46:54

Tak, JavaScript ma imponujące wsparcie dla programowania obiektowego, obiektów i funkcji. W rzeczywistości, jestem zaskoczony, że musisz zadać to pytanie! Istnieje wiele zasobów online, takich jak:

Http://mckoss.com/jscript/object.htm

Http://www.webreference.com/js/column79/

Http://www.javascriptkit.com/javatutors/oopjs.shtml

Więcej zasoby: http://www.google.com/search?q=object + zorientowane + programowanie + javascript

Frameworki JavaScript, takie jak jQuery i Prototype, nie mogłyby zostać zbudowane bez tego wsparcia w silnikach JavaScript.

 1
Author: Cerebrus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-24 00:39:14

Możesz osiągnąć powyższe poprzez Javascript, nie ma to nic wspólnego z jQuery.

var ArticleVote= {}; 

ArticleVote.submitVote = function(voteResult) {
    console.log(voteResult);
}


function Vote(){
   ArticleVote.submitVote('no');
   return false;
}
 0
Author: redsquare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-02 11:42:11

Możesz użyć funkcji JavaScript jako klasy.

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());    
}

Istnieje jedna publiczna i jedna prywatna funkcja. Możesz wywołać funkcję publiczną z zewnątrz używając obiektu klasy.

 0
Author: Umesh Aawte,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-14 08:50:16