Как делают Вас, парни делают "классы" в JavaScript!?
Я использую:
function classFoo()
{
var classLevelVariable = 0;
this.classFunction = function()
{
alert("The classFunction has been called.");
classFunction2(); //Crash. classFunction2 is "undefined."
}
this.classFunction2 = function()
{
alert("classFunction2 called.");
}
}
Я никогда не смог заставить конструкторов работать. Испытанный
this.New = function(arguments)
Который работавший однажды, но не во втором классе. Так, я теперь разочаровался, они полностью, с помощью моего собственного "Инициализируют" функции, которые действуют как конструкторы.
Странность с ним работающий однажды, но не дважды, заставляет меня думать типографские ошибки между этими двумя классами..., но я думаю за 19 лет о кодировании, это, которое, вероятно, не является этим.
Я использую отладчик Chrome, и я не получаю ошибок помимо второй функции, являющейся неопределенным, будучи позвонившимся.
Javascript не использует наследование на основе классов . Таким образом, вы не можете создавать классы в Javascript, кроме как имитировать их, используя обходные пути , которые ИМХО неуклюжи и сложны.
Javascript - это прототип языка. Использование ключевого слова new
создает новый объект на основе свойства прототипа объекта-конструктора.
Вы можете получить представление о том, как можно использовать прототипное наследование для создания экземпляра нового объекта на основе прототипа здесь: http://javascript.crockford.com/prototypal.html
JavaScript - это язык программирования, основанный на прототипах. Понятие класса не существует или понятие класса такое же, как и у объекта. Он сильно отличается от, скажем, языка программирования Java. Не обманывайтесь их именами, на этом сходство заканчивается.
Я задал этот вопрос когда-то еще. Я получил ответ с красивой ссылкой на эти слайды презентации Джона Ресига. Посмотрите на это и посмотрите, поможет ли это понять JavaScript и цепочки прототипов.
Вот хорошая статья на sitepoint.com об объектно-ориентированном программировании на JavaScript.
Эта статья на javascriptkit.com более проста.
Вы можете использовать функцию для создания объекта, установить его свойства и функции, как здесь:
person = new Object()
person.name = "Tim Scarfe"
person.height = "6Ft"
person.run = function() {
this.state = "running"
this.speed = "4ms^-1"
}
или использовать конструкторы:
function person(name,height,speed){
this.name = name;
this.height = height;
this.speed = speed;
}
var p1=new person('tom', '6ft','15kmph');
alert(p1.height);
или использовать прототипирование для расширения объектов:
person.prototype.sayHello = function(){alert("Hi, I'm " + name;}
var p2 = new person('sam', '5.9ft', '12kmph');
p2.sayHello();//alert-> Hi, I'm sam
более подробная информация находится на страницах по ссылкам.
JavaScript - это язык прототипирования , поэтому здесь все немного по-другому.
Вот поясняющий фрагмент кода:
(function(){ // create an isolated scope
// My Object we created directly
var myObject = {
a: function(x,y) {
console.log('a');
},
b: function(x,y) {
console.log('b');
this.a(x,y);
}
};
})();
(function(){ // create an isolated scope
// Create a Object by using a Class + Constructor
var myClass = function(x,y) {
console.log('myClass: constructor');
this.b(x,y);
};
myClass.prototype = {
a: function(x,y) {
console.log('myClass: a');
},
b: function(x,y) {
console.log('myClass: b');
this.a(x,y);
}
};
// Define a function that should never inherit
myClass.c = function(x,y) {
console.log('myClass: c');
this.a(x,y);
};
// Create Object from Class
var myObject = new myClass();
// Will output:
// myClass: constructor
// myClass: b
// myClass: a
// Define a function that should never inherit
myObject.d = function(x,y) {
console.log('myObject: d');
this.a(x,y);
};
// Test the world is roung
console.log(typeof myClass.c, 'should be undefined...');
console.log(typeof myClass.d, 'should be function...');
})();
(function(){ // create an isolated scope
// If you are using a framework like jQuery, you can obtain inheritance like so
// Create a Object by using a Class + Constructor
var myClass = function(x,y) {
console.log('myClass: constructor');
this.b(x,y);
};
myClass.prototype = {
a: function(x,y) {
console.log('myClass: a');
},
b: function(x,y) {
console.log('myClass: b');
this.a(x,y);
}
};
// Create new Class that inherits
var myOtherClass = function(x,y) {
console.log('myOtherClass: constructor');
this.b(x,y);
};
$.extend(myOtherClass.prototype, myClass.prototype, {
b: function(x,y) {
console.log('myOtherClass: b');
this.a(x,y);
}
});
// Create Object from Class
var myOtherObject = new myOtherClass();
// Will output:
// myOtherClass: constructor
// myOtherClass: b
// myClass: a
})();
(function(){ // create an isolated scope
// Prototypes are useful for extending existing classes for the future
// Such that you can add methods and variables to say the String class
// To obtain more functionality
String.prototype.alert = function(){
alert(this);
};
"Hello, this will be alerted.".alert();
// Will alert:
// Hello, this will be alerted.
})();
Существуют библиотеки, которые могут помочь с этим, например:
С использованием инфраструктуры javascript Prototype.
Я считаю, что ваша первоначальная напыщенная речь (см. историю изменений вопроса) заслуживает ответа. На мой взгляд, очень противоречит духу программирования и информатики объявлять язык сломанным только потому, что вы не можете заставить его работать .
Прошу простить меня, если я оскорбляю вас, когда говорю, что удивлен, что они могут давать степени CS людям с таким парадигматическим невежеством. Когда я пошел в школу, что было всего около 5 лет назад, я выполнял свои задания на 6 разных языках: MIPS, Verilog, Scheme, Java, C / C ++ и Python. Мы использовали множество парадигм, включая функциональную и ООП, но также и другие стили. Если вы не познакомились с этими разными точками зрения, ни одна из которых не нова, ваше образование будет неполным.
Вам приходило в голову, что то, что вы считаете каноническим ООП, всего лишь одна формулировка принципов ООП ? В Javascript объекты создаются из «прототипа», и это не то же самое, что класс. Когда вы ожидаете, что он будет работать как язык ООП на основе классов, он не оправдает ваших ожиданий. Java и C ++ не являются золотым стандартом ООП, и ООП не является универсальным средством программирования.
Если рассматривать удивительные приложения, написанные на Javascript за последние 3-5 лет, удивительно, что человек может сделать такое утверждение:
Можно было бы подумать, что мы применили бы наши лучшие практики кодирования к последние шесть десятилетий в этом. Нет, конечно нет. Что у нас есть? Функции внутри функций ... какой-то странный ублюдок классов. Совершенно без согласованности ...
Сказать, что, несмотря на блестящие достижения команд блестящих разработчиков Javascript, язык не работает, потому что вы испытываете трудности с его пониманием, это, в общем, удивительно.
Пожалуйста, примите во внимание, что вместо того, чтобы язык ошибочен, в настоящее время вы можете не обладать перспективой, необходимой для его понимания.
PS, Вы упомянули, что "используете JavaScript, чтобы ИЗБЕЖАТЬ FLASH!" Похоже, у вас очень плохая стратегия для установления фактов, поскольку Javascript и ActionScript реализуют одну и ту же спецификацию: ECMAScript.