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

13
задан Michael Petrotta 19 July 2010 в 04:26
поделиться

6 ответов

Javascript не использует наследование на основе классов . Таким образом, вы не можете создавать классы в Javascript, кроме как имитировать их, используя обходные пути , которые ИМХО неуклюжи и сложны.

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

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

8
ответ дан 1 December 2019 в 22:38
поделиться

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

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

5
ответ дан 1 December 2019 в 22:38
поделиться

Вот хорошая статья на 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

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

2
ответ дан 1 December 2019 в 22:38
поделиться

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

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

1
ответ дан 1 December 2019 в 22:38
поделиться

С использованием инфраструктуры javascript Prototype.

-2
ответ дан 1 December 2019 в 22:38
поделиться

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

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

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

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

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

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

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


PS, Вы упомянули, что "используете JavaScript, чтобы ИЗБЕЖАТЬ FLASH!" Похоже, у вас очень плохая стратегия для установления фактов, поскольку Javascript и ActionScript реализуют одну и ту же спецификацию: ECMAScript.

7
ответ дан 1 December 2019 в 22:38
поделиться
Другие вопросы по тегам:

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