Для подведения итогов то, что я изучил до сих пор:
Вот Основная функция, которая делает Class.extend () работой в jQuery (Скопированный от Простое Наследование JavaScript John Resig):
// Inspired by base2 and Prototype
(function(){
var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
// The base Class implementation (does nothing)
this.Class = function(){};
// Create a new Class that inherits from this class
Class.extend = function(prop) {
var _super = this.prototype;
// Instantiate a base class (but only create the instance,
// don't run the init constructor)
initializing = true;
var prototype = new this();
initializing = false;
// Copy the properties over onto the new prototype
for (var name in prop) {
// Check if we're overwriting an existing function
prototype[name] = typeof prop[name] == "function" &&
typeof _super[name] == "function" && fnTest.test(prop[name]) ?
(function(name, fn){
return function() {
var tmp = this._super;
// Add a new ._super() method that is the same method
// but on the super-class
this._super = _super[name];
// The method only need to be bound temporarily, so we
// remove it when we're done executing
var ret = fn.apply(this, arguments);
this._super = tmp;
return ret;
};
})(name, prop[name]) :
prop[name];
}
// The dummy class constructor
function Class() {
// All construction is actually done in the init method
if ( !initializing && this.init )
this.init.apply(this, arguments);
}
// Populate our constructed prototype object
Class.prototype = prototype;
// Enforce the constructor to be what we expect
Class.constructor = Class;
// And make this class extendable
Class.extend = arguments.callee;
return Class;
};
})();
, Как только Вы работали, выполнил этот код, тогда это делает следующий код от ответ insin возможный:
var MyWidget = Class.extend({
init: function(widget_name){
this.widget_name = widget_name;
},
doSomething: function() {
alert('my name is ' + this.widget_name);
}
});
Это - хорошее, чистое решение. Но мне интересно видеть, есть ли у кого-либо решение, которое не требует добавления ничего к jQuery.
#include <windows.h>
double PCFreq = 0.0;
__int64 CounterStart = 0;
void StartCounter()
{
LARGE_INTEGER li;
if(!QueryPerformanceFrequency(&li))
cout << "QueryPerformanceFrequency failed!\n";
PCFreq = double(li.QuadPart)/1000.0;
QueryPerformanceCounter(&li);
CounterStart = li.QuadPart;
}
double GetCounter()
{
LARGE_INTEGER li;
QueryPerformanceCounter(&li);
return double(li.QuadPart-CounterStart)/PCFreq;
}
int main()
{
StartCounter();
Sleep(1000);
cout << GetCounter() <<"\n";
return 0;
}
Эта программа должна вывести число, близкое к 1000 (спящий режим Windows не такой точный, но должен быть как 999).
Функция StartCounter ()
записывает количество тиков счетчика производительности в переменную CounterStart
. Функция GetCounter ()
возвращает количество миллисекунд с момента последнего вызова StartCounter ()
как двойное, поэтому, если GetCounter ()
возвращает 0,001, значит, оно было примерно через 1 микросекунду с тех пор, как был вызван StartCounter ()
.
Если вы хотите, чтобы таймер использовал секунды, вместо этого измените
PCFreq = double(li.QuadPart)/1000.0;
на
PCFreq = double(li.QuadPart);
или, если вы хотите микросекунды, используйте
PCFreq = double(li.QuadPart)/1000000.0;
Но на самом деле речь идет об удобстве, так как он возвращает двойное значение.
Эта статья, безусловно, является наиболее полным ответом на этот замечательный вопрос:
В сообщении также есть ссылки на другие ресурсы по этой теме.
Удачи, Мэтью
Информация в статье включает:
Ошибки
HIG
Облегченные версии Интернет
Возможности подключения (отличная информация, которую вы, возможно, удивитесь, прочитав)
Чрезмерное использование полосы пропускания более
Возможности устройств сотовых сетей
чтобы сделать именно то, что вам нужно).
На платформах, отличных от Windows, нет функции QueryPerformanceCounter, поэтому решение не будет напрямую переносимым. Однако, если вы обернете его в класс, такой как вышеупомянутый HRTimer
, будет легче изменить реализацию класса, чтобы использовать то, что текущая платформа действительно может предложить (возможно, через Boost или что-то еще. !).