Browse files

use node 'inherits', add browser-friendly version

  • Loading branch information...
1 parent 112807f commit 7aa40586ca55e1083e1f04db0d0d4459ba525af1 @dimsmol dimsmol committed with Mar 21, 2013
Showing with 69 additions and 122 deletions.
  1. +42 −51 README.md
  2. +0 −40 inherits-old.js
  3. +1 −29 inherits.js
  4. +23 −0 inherits_browser.js
  5. +3 −2 package.json
View
93 README.md
@@ -1,51 +1,42 @@
-A dead simple way to do inheritance in JS.
-
- var inherits = require("inherits")
-
- function Animal () {
- this.alive = true
- }
- Animal.prototype.say = function (what) {
- console.log(what)
- }
-
- inherits(Dog, Animal)
- function Dog () {
- Dog.super.apply(this)
- }
- Dog.prototype.sniff = function () {
- this.say("sniff sniff")
- }
- Dog.prototype.bark = function () {
- this.say("woof woof")
- }
-
- inherits(Chihuahua, Dog)
- function Chihuahua () {
- Chihuahua.super.apply(this)
- }
- Chihuahua.prototype.bark = function () {
- this.say("yip yip")
- }
-
- // also works
- function Cat () {
- Cat.super.apply(this)
- }
- Cat.prototype.hiss = function () {
- this.say("CHSKKSS!!")
- }
- inherits(Cat, Animal, {
- meow: function () { this.say("miao miao") }
- })
- Cat.prototype.purr = function () {
- this.say("purr purr")
- }
-
-
- var c = new Chihuahua
- assert(c instanceof Chihuahua)
- assert(c instanceof Dog)
- assert(c instanceof Animal)
-
-The actual function is laughably small. 10-lines small.
+Browser-friendly inheritance fully compatible with standard node.js
+[inherits](http://nodejs.org/api/util.html#util_util_inherits_constructor_superconstructor).
+
+This package exports standard `inherits` from node.js `util` module in
+node environment, but also provides alternative browser-friendly
+implementation through [browser
+field](https://gist.github.com/shtylman/4339901). Alternative
+implementation is a literal copy of standard one located in standalone
+module to avoid requiring of `util`. It also has a shim for old
+browsers with no `Object.create` support.
+
+While keeping you sure you are using standard `inherits`
+implementation in node.js environment, it allows bundlers such as
+[browserify](https://github.com/substack/node-browserify) to not
+include full `util` package to your client code if all you need is
+just `inherits` function. It worth, because browser shim for `util`
+package is large and `inherits` is often the single function you need
+from it.
+
+It's recommended to use this package instead of
+`require('util').inherits` for any code that has chances to be used
+not only in node.js but in browser too.
+
+## usage
+
+```js
+var inherits = require('inherits');
+// then use exactly as the standard one
+```
+
+## note on version ~1.0
+
+Version ~1.0 had completely different motivation and is not compatible
+neither with 2.0 nor with standard node.js `inherits`.
+
+If you are using version ~1.0 and planning to switch to ~2.0, be
+careful:
+
+* new version uses `super_` instead of `super` for referencing
+ superclass
+* new version overwrites current prototype while old one preserves any
+ existing fields on it
View
40 inherits-old.js
@@ -1,40 +0,0 @@
-// This is a less perfect implementation of the inherits function,
-// designed to work in cases where ES5 is not available.
-//
-// Note that it is a bit longer, and doesn't properly deal with
-// getter/setters or property descriptor flags (enumerable, etc.)
-
-module.exports = inheritsOld
-
-function inheritsOld (c, p, proto) {
- function F () { this.constructor = c }
- F.prototype = p.prototype
- var e = {}
- for (var i in c.prototype) if (c.prototype.hasOwnProperty(i)) {
- e[i] = c.prototype[i]
- }
- if (proto) for (var i in proto) if (proto.hasOwnProperty(i)) {
- e[i] = proto[i]
- }
- c.prototype = new F()
- for (var i in e) if (e.hasOwnProperty(i)) {
- c.prototype[i] = e[i]
- }
- c.super = p
-}
-
-// function Child () {
-// Child.super.call(this)
-// console.error([this
-// ,this.constructor
-// ,this.constructor === Child
-// ,this.constructor.super === Parent
-// ,Object.getPrototypeOf(this) === Child.prototype
-// ,Object.getPrototypeOf(Object.getPrototypeOf(this))
-// === Parent.prototype
-// ,this instanceof Child
-// ,this instanceof Parent])
-// }
-// function Parent () {}
-// inheritsOld(Child, Parent)
-// new Child
View
30 inherits.js
@@ -1,29 +1 @@
-module.exports = inherits
-
-function inherits (c, p, proto) {
- proto = proto || {}
- var e = {}
- ;[c.prototype, proto].forEach(function (s) {
- Object.getOwnPropertyNames(s).forEach(function (k) {
- e[k] = Object.getOwnPropertyDescriptor(s, k)
- })
- })
- c.prototype = Object.create(p.prototype, e)
- c.super = p
-}
-
-//function Child () {
-// Child.super.call(this)
-// console.error([this
-// ,this.constructor
-// ,this.constructor === Child
-// ,this.constructor.super === Parent
-// ,Object.getPrototypeOf(this) === Child.prototype
-// ,Object.getPrototypeOf(Object.getPrototypeOf(this))
-// === Parent.prototype
-// ,this instanceof Child
-// ,this instanceof Parent])
-//}
-//function Parent () {}
-//inherits(Child, Parent)
-//new Child
+module.exports = require('util').inherits
View
23 inherits_browser.js
@@ -0,0 +1,23 @@
+if (typeof Object.create === 'function') {
+ // implementation from standard node.js 'util' module
+ module.exports = function inherits(ctor, superCtor) {
+ ctor.super_ = superCtor
+ ctor.prototype = Object.create(superCtor.prototype, {
+ constructor: {
+ value: ctor,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+ };
+} else {
+ // old school shim for old browsers
+ module.exports = function inherits(ctor, superCtor) {
+ ctor.super_ = superCtor
+ var TempCtor = function () {}
+ TempCtor.prototype = superCtor.prototype
+ ctor.prototype = new TempCtor()
+ ctor.prototype.constructor = ctor
+ }
+}
View
5 package.json
@@ -1,8 +1,9 @@
{ "name" : "inherits"
-, "description": "A tiny simple way to do classic inheritance in js"
+, "description": "Browser-friendly inheritance fully compatible with standard node.js inherits()"
, "version" : "1.0.0"
-, "keywords" : ["inheritance", "class", "klass", "oop", "object-oriented"]
+, "keywords" : ["inheritance", "class", "klass", "oop", "object-oriented", "inherits", "browser", "browserify"]
, "main" : "./inherits.js"
+, "browser" : "./inherits_browser.js"
, "repository" : "https://github.com/isaacs/inherits"
, "license": { "type": "WTFPL2" }
, "author" : "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)" }

0 comments on commit 7aa4058

Please sign in to comment.