tags:

views:

124

answers:

2

Hi,

Douglas Crockford seems to like the following inheritance approach:

if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        function F() {}
        F.prototype = o;
        return new F();
    };
}
newObject = Object.create(oldObject);

It looks OK to me, but how does it differ from John Resig's simple inheritance approach?

Basically it goes down to

newObject = Object.create(oldObject);

versus

newObject = Object.extend();

And I am interested in theories. Implementation wise there does not seem to be much difference.

+5  A: 

They are completely different.

Douglas Crockford's method creates an instance that inherits a different instance.

John Resig's approach creates a class that inherits a different class.

When uding Douglas Crockford's method, you're creating a new object instance that inherits a single existing instance.

When using John Resig's approach, you're creating a constructor function, which you can then use to create instances of the inherited class.

SLaks
+5  A: 

The approach is completely different, the Resig technique creates constructor functions, this approach is also known as classical inheritance i.e.:

var Person = Class.extend({
  init: function(isDancing){
    this.dancing = isDancing;
  }
});

var p = new Person(true);

As you see, the Person object is actually a constructor function, which is used with the new operator.

With the Object.create technique, the inheritance is based on instances, where objects inherit from other objects directly, which is also known as Prototypal Inheritance or Differential Inheritance.

CMS
@CMS, Just interested, what's your opinion on Crockford's approach? I could never quite understand the appeal of contructor-less instances...
J-P
@J-P: I really like [`Object.create`](https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/create) it makes prototypal inheritance very simple, and you can build really clever creational patterns with it, and now with the ECMAScript 5th Edition, the standard compliant method can use property descriptors... very powerful...
CMS
So, why would one use one over another? I need to build a system and utilize some clever inheritance, but I do not see any reason to pick one over another.
rFactor
@Tower: The pseudo-classical approach, like the Resig's *simple inheritance*, the [base2](http://code.google.com/p/base2/) library or the approach of [PrototypeJS](http://www.prototypejs.org/learn/class-inheritance) can be easy to gasp by people used to work with *classical* languages, so it may depend on your team skills, IMO, I really like prototypal inheritance for its simplicity, but for sure, you'll need to start thinking *prototypically*. Another option can be the use plain [constructors](http://mckoss.com/jscript/object.htm), but be sure to learn [how they work](http://bit.ly/cidKWg).
CMS