Как вы создаете классы в JavaScript?

Как вы, ребята, делаете "классы" в 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, и я не получаю никаких ошибок, кроме второй функции undefined при вызове.

Ответ 1

Javascript не использует наследование на основе классов. Таким образом, вы не можете создавать классы в Javascript, за исключением того, чтобы имитировать их с помощью обходных решений, которые являются IMHO неуклюжими и сложными.

Javascript - это прототипный язык. Использование ключевого слова new создает новый объект, основанный на свойстве prototype объекта-конструктора.

Вы можете получить представление о том, как использовать прототипное наследование для создания нового объекта на основе прототипа объекта: http://javascript.crockford.com/prototypal.html

Ответ 2

Я чувствую, что ваш первоначальный рассказ (см. историю изменений вопроса) заслуживает ответа. Это очень противоречит духу программирования и информатики, на мой взгляд, объявить язык сломанным только потому, что вы не можете сделать его.

Пожалуйста, простите меня, если я оскорблю вас, когда я скажу, что я удивлен, что они могут дать CS-градусы людям с таким парадигматическим невежеством. Когда я ходил в школу, которая была всего около 5 лет назад, я выполнял свои задания на 6 разных языках: MIPS, Verilog, Scheme, Java, C/С++ и Python. Мы использовали множество парадигм, включая функциональные и ООП, но и другие стили. Если вы не подвергались этим различным перспективам, ни одно из которых не является новым, ваше образование не является полным.

Пришло ли вам в голову, что то, что вы считаете каноническим ООП, означает только одну формулировку принципов ООП? В объектах Javascript создается экземпляр "прототипа", и это не то же самое, что класс. Когда вы ожидаете, что он будет работать как классный язык ООП, он не оправдает ваших ожиданий. Java и С++ не являются золотым стандартом ООП, а также не являются ООП для всех программ программирования.

Когда вы рассматриваете удивительные приложения, которые были написаны в Javascript за последние 3-5 лет, удивительно, что человек может сделать выражение следующим образом:

Можно подумать, что мы применили бы наши лучшие методы кодирования в течение последних шести десятилетий. Нет, конечно нет. Что у нас есть? Функции внутри функций... некоторые странные бастардизации классов. В комплекте без согласованности...

Сказать, что, несмотря на блестящие достижения, сделанные командами блестящих разработчиков Javascript, язык сломан, потому что вы с трудом понимаете, что это, ну, удивительно.

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


PS, Вы упоминали, что вы используете JavaScript для удаления FLASH! Похоже, у вас очень плохая стратегия для выяснения фактов, поскольку Javascript и ActionScript реализуют ту же спецификацию: ECMAScript.

Ответ 3

JavaScript - это прототип языка программирования. Концепция класса не существует или понятие класса совпадает с понятием объекта. Это сильно отличается от языка программирования Java. Не обманывайтесь их именами, сходства заканчиваются там.

Я спросил этот вопрос, пока я не вернулся. Я получил ответ с хорошей ссылкой на эти слайды презентаций от Джона Ресига. Посмотрите на это и посмотрите, помогает ли это с пониманием цепочек JavaScript и прототипов.

Ответ 4

Здесь - хорошая статья о 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

более подробная информация находится на связанных страницах.

Ответ 5

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

Есть библиотеки, которые могут помочь с этим, например:

Ответ 6

Используя фреймворк прототипа javascript.