Будет ли новый способ управления классами JavaScript? - PullRequest
2 голосов
/ 23 апреля 2011

Кто-нибудь знает, изменится ли структурирование javascript? Я имею в виду, что у меня есть способ управлять классами javascript в пакетах, как в Java. Уже есть способ?

Ответы [ 5 ]

4 голосов
/ 02 мая 2011

Полагаю, вы знакомы с концепцией Java по именованию пакетов после того, как вы владеете доменом, что позволяет избежать коллизий с пакетами других поставщиков.Вы можете смоделировать пакеты Java (и избежать возможных коллизий naemspace) с помощью:

if (typeof(org) == "undefined")
    org = {};

if (typeof(org.mydomain) == "undefined")
    org.mydomain = {};

if (typeof(org.mydomain.mypackage) == "undefined")
    org.mydomain.mypackage = {};

org.mydomain.mypackage.MyClass = function (newA) {
    // constructor
    this.a = newA;
}

org.mydomain.mypackage.MyClass.staticMethod = function () {
    // static method
    return "static";
}

org.mydomain.mypackage.MyClass.prototype.method = function () {
    // normal method
    return a;
}

var o = new org.mydomain.mypackage.MyClass(13);
console.log(o.method());
console.log(org.mydomain.mypackage.MyClass.staticMethod());

Вы можете даже смоделировать Java import, если вы работаете в ограниченной области.(Выполнение этого в глобальном масштабе устранит весь смысл упаковки):

function afunc() {
    var MyClass = org.mydomain.mypackage.MyClass;

    var o = new MyClass(33);
    console.log(o.method());
    console.log(MyClass.staticMethod());
}

Самым слабым звеном здесь является корень нашего пространства имен, org (или com или любой домен верхнего уровня),Другой класс может использовать его по некоторым другим причинам.Использование org_mydomain в качестве корня вместо org.mydomain может обеспечить некоторую безопасность.

Редактировать:

У вас также есть другие возможности для имени root, если вы хотитеИзбегайте использования TLD в качестве корня.Если ваше доменное имя достаточно уникально (например, хип с ошибкой, например foogz.com ), вы можете предположить, что не будет другой компании, пишущей повторно используемые классы JavaScript, которые будут использовать foogz.org или foogz.bizтак что, вероятно, вы будете единственным foogz там.:)

Другая возможность - добавить свой TLD к имени домена и использовать его для первого тега, например: mydomainorg.packagename.ClassName.

3 голосов
/ 23 апреля 2011

Нет классов JavaScript.Есть только объекты.Вы можете упаковать кучу объектов в другой объект и обращаться с ним как с модулем / пространством имен, если хотите.(пример в конце.)

Из-за этого не может быть никаких «улучшений» в области классов JavaScript, потому что их нет, и я надеюсь, что их тоже никогда не будет.И, честно говоря, это к лучшему.Вы бы предпочли иметь дело с безумными получателями / установщиками, статическими членами, защищенными, приведением типов и т. Д. И т. Д.?Прототип наследования превосходит «Классическое наследство» по милям.Просто у JavaScript не было слишком много времени, чтобы все сделать правильно.

Для удивительных объяснений того, как работают объекты JavaScript, я рекомендую Дугласу Крокфордсу "" На JavaScript " или некоторые ответы от наших собственных членов.

Пример "пространства имен":

var obj = {

    classRoom : {...},
    objectify : function() {...},
    capacity : 5
};
var myClass = obj.classRoom; //access it like you access a module
var capacity = 7; //this is a global variable named capacity, so it won't tamper with obj.capacity
0 голосов
/ 23 апреля 2011

Есть некоторые предположения (например, Джона Резига ) о новых функциях, таких как замораживание объектов и пакеты, которые могут быть добавлены в ECMAScript Harmony (он же 6-е издание).

Однако я лично сомневаюсь, что языковой комитет рассмотрит столь радикальные изменения в том, как язык обрабатывает некоторые из своих основных принципов ОО.

0 голосов
/ 23 апреля 2011

Проверьте http://joose.it, у него отличная система модулей (библиотека, а не расширение языка). В четвертой редакции спецификации ECMA-262 есть пакеты, и она реализована в ActionScript.

0 голосов
/ 23 апреля 2011

JavaScript - это динамический код в файле. Все, что вы делаете, это загружаете некоторый исходный код и запускаете его динамически.

Каждая структурирующая и управляющая система динамически записывается и выполняется во время выполнения. Существует множество способов управления и структурирования кода JavaScript.

Лично я рекомендую requireJS, поскольку он не привязан ни к каким фреймворкам / другим библиотекам.

...