Я не уверен, почему люди продолжают отвечать на этот вопрос без!
Существует абсолютно один способ, который я обрисую с помощью очень маленького сценария, который не обязательно должен быть Джон Резиг, чтобы понять ...
Прежде чем я сделаю это, я также констатирую, что в JavaScript ваш конструктор работал бы, проверяя массивы или итерируя литерал «arguments».
например. В моем конструкторе моего «класса» я итерировал arugment, определял тип базовых arugment и обрабатывал его разумно.
Это означает, что если вы передадите массив, я итерирую arugment, чтобы найти массив, а затем итерирую массив, чтобы выполнить дальнейшую обработку в зависимости от типа элемента в массиве.
например. -> новый someClass ([instanceA, instanceB, instanceC])
Однако вы, ребята, ищете более "C" стиль подхода к перегрузке операторов, который на самом деле может быть достигнут вопреки убеждениям населения.
Вот класс, который я создал с помощью MooTools, который поддерживает перегрузку операторов. В простом старом JavaScript вы просто использовали бы тот же метод toString, только прикрепив его непосредственно к прототипу экземпляра.
Моя основная причина отображения этого подхода заключается в том, что я постоянно читаю текст, в котором говорится, что эту функцию «невозможно» подражать. Нет ничего невозможного, только достаточно сложно, и я покажу это ниже ...
//////
debugger;
//Make a counter to prove I am overloading operators
var counter = 0;
//A test class with a overriden operator
var TestClass = new Class({
Implements: [Options, Events],
stringValue: 'test',
intValue: 0,
initialize: function (options) {
if (options && options instanceof TestClass) {
//Copy or compose
this.intValue += options.intValue;
this.stringValue += options.stringValue;
} else {
this.intValue = counter++;
}
},
toString: function () {
debugger;
//Make a reference to myself
var self = this;
//Determine the logic which will handle overloads for like instances
if (self instanceof TestClass) return self.intValue;
//If this is not a like instance or we do not want to overload return the string value or a default.
return self.stringValue;
}
});
//Export the class
window.TestClass = TestClass;
//make an instance
var myTest = new TestClass();
//make another instance
var other = new TestClass();
//Make a value which is composed of the two utilizing the operator overload
var composed = myTest + other;
//Make a value which is composed of a string and a single value
var stringTest = '' + myTest;
//////
Последнее отображение этой номенклатуры наблюдалось на странице документации XDate:
http://arshaw.com/xdate/
В этом случае я считаю, что это даже проще, он мог бы использовать прототип объекта Date для достижения того же.
Тем не менее метод, который я привел в качестве примера, должен отображать этот стиль использования для других.
Edit:
У меня есть полная реализация здесь:
http://netjs.codeplex.com/
Наряду с другими вкусностями.