JQuery или JavaScript имеют понятие классов и объектов?

Подкаст Переполнения стека является причиной, которая я теперь здесь. Jeff, к сожалению, является бедным менеджером проектов с точки зрения руководящих ожиданий и устанавливающий временные шкалы - все же, бета прибыла, и это довольно достойно! Мир.NET чужд мне, таким образом, я наслаждался подкастом Переполнения стека.

На этой неделе в Технологии другой подкаст, который я регулярно слушаю. К сожалению, я чувствую, что ни один из участников дискуссии кроме Leo Laporte не делает домашней работы до шоу, столь многие мнения (особенно John C. Dvorak) не информированы.

я недавно начал слушать подкасты Переговоров IT, и я получил достаточно хорошей информации, которую я пожертвовал. Выбор смешан, но мне действительно нравятся переговоры от различных конференций, что я был неспособен принять участие.

Благодаря другим людям, которые ответили ссылками на другие подкасты, о которых я не услышал. Я - новичок, таким образом, я еще не могу увеличить очки.

19
задан Peter Mortensen 24 April 2010 в 00:35
поделиться

7 ответов

Все является объектом в JavaScript

В отличие от других якобы чистых языков ООП. Функции тоже являются объектами, но с таким же успехом они могут быть и конструкторами объектов.

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

А как насчет того прототипа thingy

Как многие уже сказали , в JavaScript объекты наследуются от объектов. У этой вещи есть полезные стороны, один из которых можно назвать, паразитарное наследование (если я правильно помню контекст, в котором Дуглас Крокфорд упомянул это). В любом случае, эта концепция прототипа связана с концепцией цепочки прототипов , которая похожа на цепочку родитель -> потомок в классических объектно-ориентированных языках. Итак, наследование. Если метод 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();

Hold Вы сказали кое-что о паразитном наследовании

. Существует ключевое различие между классическим объектно-ориентированным наследованием и наследованием на основе прототипов. Когда объекты наследуют от объектов, они также наследуют состояние . Возьмем этот пример:

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 - паразит анонимного человека, потому что беспощадно высасывает у человека интеллект. Кроме того, учитывая приведенное выше определение, все будущие взрослые будут умными, что, к сожалению, не всегда верно. Но это не значит, что наследование объектов - это плохо. Это просто инструмент, как и все остальное. Мы должны использовать его по своему усмотрению.

В классическом объектно-ориентированном наследовании мы не можем сделать то, что описано выше. Однако мы могли бы эмулировать это, используя статические поля. Но тогда все экземпляры этого класса будут иметь одинаковое значение для этого поля.

78
ответ дан 30 November 2019 в 01:48
поделиться

Javascript поддерживает объектов , но не классы - он использует основанную на прототипах объектную систему.

12
ответ дан 30 November 2019 в 01:48
поделиться

Конечно, в 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 будет методом объекта. не могу сказать наверняка, это может быть то, что вы бы назвали статическим методом на другом языке.

1
ответ дан 30 November 2019 в 01:48
поделиться

Да, 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+oriated+programming+javascript

Фреймворки JavaScript, такие как jQuery и Prototype, не могли бы быть созданы без этой поддержки в движках JavaScript.

1
ответ дан 30 November 2019 в 01:48
поделиться

Вы можете достичь вышеупомянутого с помощью Javascript, ничего общего с jQuery.

var ArticleVote= {}; 

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


function Vote(){
   ArticleVote.submitVote('no');
   return false;
}
0
ответ дан 30 November 2019 в 01:48
поделиться

Вы можете использовать функцию 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());    
}

Есть одна публичная и одна приватная функция. Вы можете вызвать публичную функцию извне, используя объект класса.

0
ответ дан 30 November 2019 в 01:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: