Skip to content

Instantly share code, notes, and snippets.

@dchentech
Forked from andrewdavey/Object.inherit.js
Created March 21, 2014 10:59
Show Gist options
  • Save dchentech/9683799 to your computer and use it in GitHub Desktop.
Save dchentech/9683799 to your computer and use it in GitHub Desktop.
(function () {
"use strict";
var copyOwnProperties = function (from, to) {
for (var propertyName in from) {
if (from.hasOwnProperty(propertyName)) {
to[propertyName] = from[propertyName];
}
}
};
var inherit = function (additionalProperties) {
var subclass = Object.create(this);
subclass.create = function () {
// When calling `MyClass.create()` directly, `this` will be `MyClass` as expected.
// When passing `MyClass.create` to another function we lose the intended `this` (it's probably set to `window` or null)
// so explicitly use the `subclass` in that case.
var prototype = (this && this !== window) ? this : subclass;
var instance = Object.create(prototype);
// The instance may have an `initialize` method.
if (typeof instance.initialize === "function") {
instance.initialize.apply(instance, arguments);
}
return instance;
};
copyOwnProperties(additionalProperties, subclass);
return subclass;
};
Object.inherit = inherit;
} ());
var User = Object.inherit({
initialize: function(name) {
this.name = name;
},
sayHello: function() {
console.log("Hello, " + this.name);
}
});
var john = User.create("John");
john.sayHello();
// Can inherit from prototype objects
var SuperUser = User.inherit({
sayHello: function() {
console.log("Hello super, " + this.name);
}
});
// Can pass `create` to other functions and it works as expected
var users = [ "Andrew", "Bob", "Chris" ].map(SuperUser.create);
// users === [ SuperUser.create("Andrew"), SuperUser.create("Bob"), SuperUser.create("Chris") ];
users.forEach(function(user) {
user.sayHello();
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment