2013-02-21 2 views
0

UPDATEЧто такое простой подход для включения ООП в javascript?

Так как я сделал этот вопрос, много воды пошла под рекой, у меня есть переключатель, чтобы использовать шаблон модуля и формат файла CommonJS + Browserify и перестать пытаться сделать Javascript более как язык объектно-ориентированного , Я обнял Javascript Prototypal Inheritance и Object.create, и я сейчас живу лучше, чем когда-либо !, почти чувствуя, что я присоединился к new Religion, извините religion ... no «new» для меня больше в JS.

Остальная часть вопроса просто история ...


Я будучи играл с объектно-ориентированным программированием на некоторое время в JavaScript.

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

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

Я хотел дать ему попытку ООП, но все решения, которые я нашел, мне показались не такими простыми, некоторые попросили меня добавить метод init или во время инициализации они проводили специальный осмотр функций, чтобы узнать, они должны быть отменены. Хотя это умно, это показалось немного излишним для простого создания объекта из класса.

Так что я пришел с этим решением:

UPDATE: в этом эксперименте, не предназначенное для замены какой-либо блестящего выхода щей библиотеки или для использования в производстве

var Nexus = function() {}; // helper function to avoid create an instance of the child class 
Object._extend = function(child, parent) { 

    var base = Nexus.prototype = parent.prototype; 
    child.prototype = new Nexus(); 

    var cp = child.prototype; 
    cp.constructor = child; 
    child._parent = base; 
}; 




/* THIS THEN IS USED LIKE THIS */ 

var Person = function (name) { 
    this.name = name; 
    console.log('Person constructor'); 
}; 

$.extend(Person.prototype, { 
    walk : function() { 
    console.log(this.name + ' is Walking!!'); 
    } 

}); 

var Student = function() { 
    // call the base class constructor 
    Student._parent.constructor.apply(this, arguments); 
    console.log('Student Constructor'); 
} 

Object._extend(Student, Person); 

$.extend(Student.prototype, { 
    walk : function() { 
    console.log(this.name + ' walks like Student'); 
    //calling a parent method 
    Student._parent.walk.apply(this, arguments); 
    } 
}); 

var p = new Person('Jon Doe'); 
p.walk(); 
console.log(p instanceof Person) // true 

var s = new Student('Joan Doe'); 
s.walk(); 
console.log(s instanceof Person) // true 
console.log(s instanceof Student) // true 

Как вы можете видеть, это подход соответствует требованиям ООП.

  1. Ребенок OBJ является экземпляром родительского класса тоже, а также экземпляр дочернего класса
  2. Ребенок OBJ может вызывать методы родительского класса для доступа перегруженных методов. (Единственное отличие от CurrentClass._parent и BaseClass.prototype заключается в том, что второй требует, чтобы потребитель класса действительно знал имя родительского класса, чего я хотел избежать).

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

Зэки в подходе я следовал:

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

Имеет ли дополнительная мануальная функция Nexus для создания правильной цепи прототипов, является проблемой для управления памятью?

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

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

Как вы думаете, добавит ли манекен-функцию Nexus какое-либо заметное влияние?

+1

На мой взгляд, ваши интуитивные чувства, которые ООП для JavaScript несколько неуместны, верны. – Pointy

+0

Да, я сделал это скорее как эксперимент, чем для реального использования. Вот почему я спрашиваю. Спасибо за ваши отзывы –

+0

@Point и OP Спасибо! Наконец, кто-то, кто не будет судить, что JavaScript - ООП, потому что это не так, он просто играет с областью. Если вам нужно скрыть данные, просто используйте шаблон модуля, не сходите с ума! – defaultNINJA

ответ

2

Имеет ли дополнительная мануальная функция Nexus для создания правильной цепи прототипов, является проблемой для управления памятью?

Нет. У вас только что есть (один!) Дополнительный объект, плавающий в памяти. Переместите его в функцию Object._extend, и он даже автоматически будет собирать мусор.

Однако вместо этого Nexus вещь вы должны использовать только Object.create. См. Также Understanding Crockford's Object.create shim.

+0

Спасибо за отзыв и окончательно попробуем Object.create shim –

+0

Для экспериментов вы не будете нужно закрепить его :-) Просто связал это, чтобы понять, почему ваш код работал. См. Также http://stackoverflow.com/q/4166616/1048572 и http://stackoverflow.com/q/2709612/1048572 – Bergi

+0

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

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