|
|
(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]]
| |