Skip to content

Latest commit

 

History

History
87 lines (67 loc) · 2.36 KB

README.md

File metadata and controls

87 lines (67 loc) · 2.36 KB

patch.js

patch.js is a simple javascript library for patching object properties withing a specific scope.

Usage

Patching Objects

You can patch properties on any object using Patch.object. The properties will be replaced with the patched version while the scope is run, and reverted to their original after.

var obj = {
  func: function() { return false; },
  prop: false
};

Patch.object(obj, {
  'func': function() { return true; },
  'prop': true
}, function() {
  console.log(obj.func()); // --> true
  console.log(obj.prop);   // --> true
});

console.log(obj.func()); // --> false
console.log(obj.prop);   // --> false

Patching Functions with Constants

If you are patching a function to return a constant value, you can just provide the value in the patch specification and it will transform it into a function for you.

var obj = {
  func: function() { return false; }
};

Patch.object(obj, { 'func': true }, function() {
  console.log(obj.func()); // --> true
})

console.log(obj.func());   // --> false

Patching the Prototype

If you want to temporarily patch all instances of an object, you can of course patch the prototype.

var Obj = function() {
  this.value = false;
};
var obj1 = new Obj();
var obj2 = new Obj();

Patch.object(Obj.prototype, { 'value': true }, function() {
  console.log(obj1.value); // --> true
  console.log(obj2.value); // --> true
});

console.log(obj1.value);   // --> false
console.log(obj2.value);   // --> false

Patching New Objects

Sometimes you want to patch new object instances created inside the scope while leaving existing and future objects alone. This can be achieved using Patch.new_objects.

var Namespace = {
  Obj: function() {
    this.value = false;
  }
};

var oldObj = new Namespace.Obj();

Patch.new_objects(Namespace, 'Obj', { value: true }, function() {
  var newObj = new Namespace.Obj();
  console.log(newObj.value); // --> true
  console.log(oldObj.value); // --> false
});

console.log(new Namespace.Obj().value); // --> false

Note you need the object the constructor is a property on; unfortunately you can't patch object constructors that are just in the local scope. In the browser, constructors in the global scope are properties on window.

Patch.new_objects(window, 'Date', { 'getTime': 100 }, func_that_creates_dates);