Подкаст Переполнения стека является причиной, которая я теперь здесь. Jeff, к сожалению, является бедным менеджером проектов с точки зрения руководящих ожиданий и устанавливающий временные шкалы - все же, бета прибыла, и это довольно достойно! Мир.NET чужд мне, таким образом, я наслаждался подкастом Переполнения стека.
На этой неделе в Технологии другой подкаст, который я регулярно слушаю. К сожалению, я чувствую, что ни один из участников дискуссии кроме Leo Laporte не делает домашней работы до шоу, столь многие мнения (особенно John C. Dvorak) не информированы.
я недавно начал слушать подкасты Переговоров IT, и я получил достаточно хорошей информации, которую я пожертвовал. Выбор смешан, но мне действительно нравятся переговоры от различных конференций, что я был неспособен принять участие.
Благодаря другим людям, которые ответили ссылками на другие подкасты, о которых я не услышал. Я - новичок, таким образом, я еще не могу увеличить очки.
В отличие от других якобы чистых языков ООП. Функции тоже являются объектами, но с таким же успехом они могут быть и конструкторами объектов.
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();
. Существует ключевое различие между классическим объектно-ориентированным наследованием и наследованием на основе прототипов. Когда объекты наследуют от объектов, они также наследуют состояние . Возьмем этот пример:
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
- паразит анонимного человека, потому что беспощадно высасывает у человека интеллект. Кроме того, учитывая приведенное выше определение, все будущие взрослые будут умными, что, к сожалению, не всегда верно. Но это не значит, что наследование объектов - это плохо. Это просто инструмент, как и все остальное. Мы должны использовать его по своему усмотрению.
В классическом объектно-ориентированном наследовании мы не можем сделать то, что описано выше. Однако мы могли бы эмулировать это, используя статические поля. Но тогда все экземпляры этого класса будут иметь одинаковое значение для этого поля.
Javascript поддерживает объектов , но не классы - он использует основанную на прототипах объектную систему.
Конечно, в 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 будет методом объекта. не могу сказать наверняка, это может быть то, что вы бы назвали статическим методом на другом языке.
Да, 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.
Вы можете достичь вышеупомянутого с помощью Javascript, ничего общего с jQuery.
var ArticleVote= {};
ArticleVote.submitVote = function(voteResult) {
console.log(voteResult);
}
function Vote(){
ArticleVote.submitVote('no');
return false;
}
Вы можете использовать функцию 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());
}
Есть одна публичная и одна приватная функция. Вы можете вызвать публичную функцию извне, используя объект класса.