Как вы делаете классы в JavaScript? - PullRequest
13 голосов
/ 19 июля 2010

Как вы, ребята, делаете "классы" в 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)

Который работал один раз, но не во втором классе. Итак, теперь я полностью отказался от них, используя свои собственные функции «Initialize», которые действуют как конструкторы.

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

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

Ответы [ 6 ]

8 голосов
/ 19 июля 2010

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

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

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

7 голосов
/ 19 июля 2010

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

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

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

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

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

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


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

5 голосов
/ 19 июля 2010

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

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

2 голосов
/ 19 июля 2010

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

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

1 голос
/ 19 июля 2010

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

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

0 голосов
/ 19 июля 2010

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

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