2009-05-17 6 views
3

Я делаю свой первый проект javascript, который сильно использует объекты. Из-за того, как он работает, почти все пользовательские объекты сделаны так:Javascript «classes» (без фреймворков)

namespaceobj = {}; 
namespaceobj.subobject = {}; 
namespaceobj.subobject.somefunction = function(arg, uments) { 
    // Do Stuff 
} 
namespaceobj.subobject.somedata = 10; 
namespaceobj.othersubject = {}; 
namespaceobj.othersubject.somefunction = function(some, args) { 
    // Do more stuff 
} 
// More subobjects etc. 

Что хорошо, так как все пользовательские объекты имеют только один экземпляр в любом случае (примеры подобъектов являются UI, инструменты, то общие данные и т. д.).

Однако я видел код сделал что-то вроде этого (синтаксис, вероятно, неправильно, это просто из памяти видеть подобный код)

function SomeClass() { 
    this.somedata = 42; 
    this.somefunction = function(a, few, args) { 
     // Do Stuff 
    } 
} 
// More classes and stuff 
// Elsewhere: 
someInstance = new SomeClass(); // AFA I recall, new was optional 
someInstance.somefunction(); 

Может кто-нибудь объяснить, как «классы» во втором примере работы, и любые подводные камни, с которыми я мог столкнуться при их использовании.

ответ

2

Я думаю, что синтаксис вы думаете выглядит следующим образом: -

function SomeClass() { 
    var somedata = 42; 
    this.somefunction = function(a, few, args) { 
    // Do Stuff like:- 
    return somedata + a; 
    } 
} 
// More classes and stuff 
// Elsewhere: 
someInstance = new SomeClass(); // AFA I recall, new was optional 
someInstance.somefunction(15); //returns 57 

Функция, которая назначается SomeFunction создается в Execution контексте что приводит, когда функция выполняется (в этом случае, когда SomeClass() выполняется как часть новой операции, назначенной someInstance). Функции могут обращаться к переменным, которые являются частью контекста выполнения, в котором они созданы, поэтому в этом случае somedata является переменной, к которой имеет доступ определенная функция.

Этот подход эффективно делает somedata частным состоянием объекта, поскольку к нему могут обращаться только функции, созданные внутри тела функции SomeClass.

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

0

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

2

Это довольно большая тема, но то, что вы видите, - это разница между объектной литературой (ваш первый пример) и конкретным брендом ООП для JavaScript. Основное различие, с которым вы столкнетесь между двумя, состоит в том, что в первом примере есть только один статический экземпляр, в то время как пересмотренная версия вашего второго примера (вы были близки) позволила вам создать несколько экземпляров класса.

Я хотел бы предложить, что вы читали JavaScript and Object Oriented Programming (OOP):

JavaScript является прекрасным языком для объектно-ориентированных веб-приложений записи. Он может поддерживать OOP , потому что он поддерживает наследование через прототипирование, а также свойства и методы. Многие разработчики отбросили JS как подходящий язык OOB , потому что они так используются для стиля класса C# и Java. Многие люди не понимают, что JavaScript поддерживает наследование. Когда вы пишете объектно-ориентированный код, он мгновенно дает вам силу; вы можете написать код, который может быть повторно использован, и , который инкапсулирован.

0

Вторая форма, возможно, является лучшей формой, потому что она создает «класс», который имеет множество функций, живущих на его прототипе. Когда новый класс создается, новый экземпляр также устанавливает свой прототип в одно и то же. В примере класса функции живут на прототипе.

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

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

В конце все объекты Javascript являются hashtables свойств и функций. Когда один доступ к объекту через «object.something», все это значение, включая функции. Однако, когда вы используете нотацию функции invocation «object.foo (...)», среда выполнения пытается найти «foo» на «объекте». Если во время выполнения не удается найти «foo» на «объекте», он попытается найти «foo» на прототипе «объекта». Это продолжается до тех пор, пока не будет найдено что-либо или не останется больше прототипов.

Время выполнения затем попытается вызвать параметры «foo» и т. Д. Естественно, что взорвать, если foo не является функцией.

Смежные вопросы