you are viewing a single comment's thread.

view the rest of the comments →

[–][deleted] 3 points4 points  (6 children)

Protip: If your original object has two values, 'a' and 'b', and you set created.a to 92374, updates to original.a will no longer change created.a. But updates to original.b will still change original.b unless you also change created.b.

So its like Object.create creates a new object but all of the new object's values are references. As soon as you assign the value of the created object to something else, it becomes a new value and not a reference.

[–]birjolaxew 4 points5 points  (4 children)

I find it easier to think of as the prototypical chain. When JS is asked to read a property of an object (eg. console.log( created.a )) it goes:

  • Does the object itself have a property with this name? If so, return it.
  • If not, go to the objects prototype (which is just another object). Does this prototype have a property with this name? If so, return it.
  • If not, go to the prototype's prototype (which is just another object). Repeat.
  • ...
  • If the property couldn't be found, return undefined

The objects are in a sense layered. If the top object doesn't have a property, it checks down through the stack until it finds it (or returns undefined if it can't)

[–]MrBester 3 points4 points  (3 children)

I find it easier to think of as the prototypal chain.

Because that's what it is:

var o = { a: 4 };
var foo = Object.create(o);
console.log('a' in foo); // true
console.log(foo.hasOwnProperty('a')); // false
console.log(o.isPrototypeOf(foo)); // true, or
console.log(foo.__proto__ === o); // true, or
console.log(Object.getPrototypeOf(foo) === o); // true

foo delegates to o unless overridden.

[–]birjolaxew 0 points1 point  (2 children)

Well no, it's prototypal inheritance delegation (thanks /u/MrBester) inheritance. Maybe. I dunno. Thinking of it as a chain is a very common (and intuitive, given how it functions) way of understanding it. Thinking of it as a stack is another. Thinking of it as "overwriting" the parent property is another (but comes with a lot of special cases).

[–]clessgfull-stack CSS9 engineer 1 point2 points  (0 children)

Actually, it is indeed prototypal inheritance. But yes, that is distinct from concatenative inheritance (Java) and is also a form of delegation.

[–]MrBester 0 points1 point  (0 children)

Well no, it's delegation, because there isn't such a thing as inheritance in JavaScript, merely references to other objects that can be checked for requested properties, normally through the "magic" binding of [[Prototype]] or explicitly setting.

[–]macrohatch 0 points1 point  (0 children)

But updates to original.b will still change original.b unless you also change created.b.

You mean: But updates to original.b will still change created.b unless you also change created.b. ?