Павло Пономаренко
aka Shock
slides.com/theshock/javascript-plugins
Plugins.refactor = function (Class, methods) {
var proto = Class.prototype;
for (var name in methods) {
methods[name].previous = proto[name];
proto[name] = methods[name];
}
};
function GameObject (name) {
this.name = name;
}
GameObject.prototype.getName = function () {
return 'Getter:' + this.name;
};
Plugins.refactor( GameObject, {
// Зверніть увагу - функція іменована
getName: function method () {
return 'Changed:' +
method.previous.call(this);
}
});
console.log(
new GameObject('FooBar')
.getName()
);
// Changed:Getter:FooBar
Код бібліотеки
Об’єкт гри
Код плагіна
Результат
Файл плагіну Owner:Title:Branch має адресу
gitlab/{author}/{title}/raw/{branch}/{title}.js
new Plugin({
version: '0.6.0',
require: [ 'Another:Plugin' ],
include: [ 'AnotherClass' ],
},
function (plugin, events, required) {
// Посилання на плагін-залежність
console.log( required['Another:Plugin'] );
// Посилання на клас з іншого файлу
console.log( plugin.included['AnotherClass'] );
});
declare( 'Handler', {
run: function () {
this.button.addEvent( 'click', this.onClick.bind(this) );
},
onClick: function () {
// do stuff
}
});
Було
declare( 'Handler', {
run: function () {
this.button.addEvent( 'click', function () {
// do stuff
});
}
});
Стало
declare( 'UnitHandler', {
run: function () {
this.unit.addEvents({
onDeploy : this.onDeploy.bind(this),
onMove : this.onMove .bind(this),
onAttack : this.onAttack.bind(this)
});
},
onDeploy : function () { /* do stuff */ },
onMove : function () { /* do stuff */ },
onAttack : function () { /* do stuff */ }
});
Було
Стало
declare( 'UnitHandler', {
run: function () {
this.unit.addListener( this );
},
onDeploy : function () { /* do stuff */ },
onMove : function () { /* do stuff */ },
onAttack : function () { /* do stuff */ }
});