Возможно ли дать частичное поведение класса javascript, как C # или патч обезьяны, как Ruby? - PullRequest
4 голосов
/ 14 мая 2011

Идея частичных классов заключается в том, что вы можете группировать определенные функции вместе.Лучший пример этого в C # - помещение определений элементов управления в один файл, а обработчиков событий - в другой.В Ruby вы можете использовать исправления Monkey для замены целых функций и т. Д., Чтобы заставить код делать то, что вы хотите.

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

Кто-нибудь знает?

Ответы [ 5 ]

6 голосов
/ 14 мая 2011
// file 1

function augment() {
    this.monkey = "monkey";
}

// file 2

function augmentMore() {
    this.patch = "patch";
}

// file 3

var o = {};
augment.call(o);
augmentMore.call(o);
console.log(o.monkey + o.patch);

Работы по исправлению обезьян. Частичные классы могут работать по соглашению. Например, рассмотрим это соглашение.

// file main
function SomeObject() {
    for (var i = 0, ii = SomeObject.Partial.length; i < ii; i++) {
         SomeObject.Partial[i].apply(this, arguments);
    }
}

SomeObject.Partial.SomeName = function() {
   ...
}

// file extra
SomeObject.Partial.SomeOtherName = function() {
   ...
}

JavaScript удивительно мощный. Был ли конкретный пример, который вы искали?

3 голосов
/ 14 мая 2011

Если такое разделение имеет реальный смысл, то вы можете сделать это:

Файл № 1

function MyObjectType() { this.init(); }

Файл № 2

MyObjectType.prototype.init = function() { this.one = 1; }

Файл № 3

MyObjectType.prototype.onClick = function() { if(this.one == 1) alert("I am so alone..."); }

И где-то еще вы можете использовать его как:

var myObject = new MyObjectType();
myObject.onClick();

Добро пожаловать в прототип, но все же своего рода функциональный мир программирования!

2 голосов
/ 16 февраля 2012

Я расширяю пример частичных классов Райноса. Следующее проверено и работает:

//  In Car.js
function Car(domelement, wheels, engine, color) {
    this.domelem = domelement;

    //  Wire in partial classes from other files
    for(var i = 0, ii = Car.Partial.length; i < ii; i++) {
         Car.Partial[i].apply(this, arguments);
    }
}
Car.Partial = [];  //  Prepare for declaration of additional partial classes

//  In Car.Events.js
Car.Partial[0] = function Events() {
    //  Create some events on Car with jQuery
    $(this.domelem).click(function() { alert('Car clicked.'); });
}

Затем вы можете использовать инструмент сборки, чтобы объединить файлы в один скрипт, или вы можете просто ссылаться на файлы в следующем порядке:

<script src="Car.js"></script>
<script src="Car.Events.js"></script>
<script>
    //  Turn first paragraph into our Car object
    var myCar = new Car($('p').get(0));
</script>
0 голосов
/ 10 августа 2015

Вот один подход с использованием ES6 и совместимость с ES5 с использованием Babel:

В этом примере я создаю MyClass в нескольких файлах, используя три файла:

index.js (это важно, так что вы можете импортировать класс только через имя папки)

symbols.js (содержит символы для частных пользователей)

extraMethods.js (файл, который позже присоединяется к прототипу класса)

index.js content

import symbols from "./symbols";

export default class MyClass {
  [symbols.existentPrivateMethod]() {
    return "this is the result";
  }
}

import additionalMethod, {anotherAdditionalMethod, additionalPrivateMethod} from "./additionalMethods";
const additionalMethodsObject = {
  additionalMethod: additionalMethod,
  anotherAdditionalMethod: anotherAdditionalMethod
};
additionalMethodsObject[symbols.additionalPrivateMethod] = additionalPrivateMethod;

Object.assign(MyClass.prototype, additionalMethodsObject);

AdditionalMethods.js содержимое

import symbols from "./symbols";

export default function additionalMethod() {
  return this[symbols.existentPrivateMethod]();
}

export function anotherAdditionalMethod() {
  return this[symbols.additionalPrivateMethod]();
}

export function additionalPrivateMethod() {
  return "yet another result";
}

symbols.js content

const symbols = {
  existentPrivateMethod: Symbol("myPrivateMethod"),
  additionalPrivateMethod: Symbol("additionalPrivateMethod")
};

export default symbols;

Завершить проект https://github.com/nicosommi/partialClass

полное объяснение http://nicosommi.com/?p=432

0 голосов
/ 20 марта 2014

Переопределите тип с помощью подхода наследования следующим образом:

var Dog = Class.extend({
    init:function(data){
         data = data || {};
         this.name = data.name;
    },
    run:function(){ 
        /*impl*/
    }
});

/*other js file that require first file */
var Dog = Dog.extend({
   init:function(data){ 
       this._super(data); 
   },
   bark:function(){ 
       return 'woof';
   }
});

Единственная проблема в этом подходе - управление зависимостями, но оно работает.

obs: используется John Resing class.js , но может быть написано в машинописи, ES6, AngularJs, ... и многих других библиотеках.

...