Differential inheritance in JavaScript: Difference between revisions

From MozillaZine Knowledge Base
Jump to navigationJump to search
m (format)
(moved to devmo)
 
(7 intermediate revisions by 4 users not shown)
Line 1: Line 1:
==Differential inheritance in Javascript==
See [http://developer.mozilla.org/en/docs/Differential_inheritance_in_JavaScript Differential inheritance in JavaScript] at [http://developer.mozilla.org MDC].


Netscape 4.x and Mozilla both provide access to the internal prototype information associated with an Object in Javascript using the <code>__proto__</code> property.  By manipulating this property, a developer can emulate "differential inheritance", a common technique in prototype-oriented programming models.
[[Category:Redirects]]
 
Differential Inheritance is a common prototype-oriented model that uses the concept that most objects are derived from other, more generic objects, and only differ in a few small aspects.  Each object maintains a reference to its prototype and a table of properties that are different.  The following code provides a simple method for "cloning" an object and a fundamental object, since the global variable Object actually refers to the Object constructor, not an actual Object.
 
<pre>
Object.prototype.clone = function(){
  var newObject = new this.constructor();
  newObject.__proto__ = this;
  return newObject;
};
 
Root = new Object();
</pre>
 
Using "clone", it becomes possible to simply derive more specific objects from a generic prototype.  The following is a simple example of building up increasingly more specific objects using the clone method and differential inheritance.
 
<pre>
Record = Root.clone();
Record.toString = function(){ return "a Record"; };
Person = Root.clone();
Person.firstName = false;
Person.lastName = false;
Person.toString = function(){
    if( this.firstName ){
      if( this.lastName ){
        return this.firstName + " " +this.lastName;
      }else{
        return this.firstName;
      }
    }else{
      if( this.lastName ){
        return this.lastName;
      }else{
        return "a Person";
    }
  }
}
JoePerson = Person.clone();
JoePerson.firstName = "Joe";
alert( JoePerson.toString() );
</pre>
 
A word of caution: Internet Explorer currently does not support the <code>__proto__</code> property.  It is recommended that this technique be reserved for situations where the developer can be certain that the script will be executed by Mozilla or other interpreters that support the <code>__proto__</code> property, like Safari and KJS.
 
[[Category:Javascript]] [[Category:Example code]] [[Category:Javascript example code]]

Latest revision as of 18:13, 24 May 2007