Note that there are some explanatory texts on larger screens.

plurals
  1. POSetting prototype on object created through Object.create
    primarykey
    data
    text
    <p>I'm having some trouble figuring out how the prototype chain is set up given the following code. </p> <pre><code>var Model = { prototype: { init: function(){}, log: function(){ console.log('instance method log was called') } }, log: function(){ console.log('class method log was called') }, create: function() { var object = Object.create(this); object.parent = this; object.prototype = object.fn = Object.create(this.prototype); return object; }, init: function() { var instance = Object.create(this.prototype); instance.parent = this; instance.init.apply(instance, arguments); return instance; } } var User = Model.create(); User.log(); // 'class method log was called' // create a new method after creation Model.warn = function() { console.warn('warn was called') } User.warn() // 'warn was called' var user = User.init(); user.log(); // 'instance method log was called' </code></pre> <p>Specifically this line confuses me in the create method:</p> <pre><code>object.prototype = object.fn = Object.create(this.prototype); </code></pre> <p>I understand how the create method is creating a new object who's prototype points back to Model, but the penultimate line seems to overwrite that prototype with a new object (Model.prototype). However, it seems the original prototype is still intact, as I can add methods to Model even after creating a new object, and the new object can still access it.</p> <p>can someone shed some light on what is actually happening?</p> <p><strong>Edit</strong> - I should point out this code comes from <em>Javascript Web Applications</em> by O'reilly</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. COIt's a little unclear as to what confuses you, but perhaps you think that `this` and `object` are referring to the same thing in `Model.create`. If so, they're not. `this` is a reference to `Model`, but `object` is a reference to a new object created from `Object.create(this)`. So when you do `object.prototype = ...whatever`, you're not overwriting `Model.prototype`, but you are *shadowing* the `.prototype` property that exists in the prototype chain of `object` by placing a property with the same name directly on `object`.
      singulars
      1. This table or related slice is empty.
    2. COI understand 'this' being Model and 'object' being a new object, rather what confuses me is that initially Object.create(this) is setting the new objects prototype to be 'Model', but then a few lines later object.prototype is reset to be Object.create(this.prototype). That's the line I don't understand. To me it looks like object.prototype is now set to an object whose prototype is set to Model.prototype (the init and log functions) but the returned object instead has access to the methods directly on Model.
      singulars
    3. COI think I see what's confusing you. The `.prototype` property that is being set on `object` has nothing to do with the prototype chain itself. Once you have created an object, it's not possible to change the prototype chain. So when a value is written to `object.prototype`, it doesn't interfere at all with the relationship between `object` and `Model`. The only time setting a `.prototype` property has an effect on the prototype chain, is when you change the `.prototype` property of a constructor function, and then only future objects made from the constructor are affected by that change.
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload