Search code examples
javascriptmozillaobject-create

Object.create method in javascript


Being a beginner in javascript, i tried to understand Object.create() method from here

https://developer-new.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create

In the example code, line 18. A accessor property is created with writable set to true. I also read that writable is only for data descriptors.

Tried running,

var o = Object.create(Object.prototype, {
  // foo is a regular "value property"
  foo: { 
    writable:true, configurable:true, value: "hello" 
  },
  // bar is a getter-and-setter (accessor) property
  bar: {
    writable: true,
    configurable: false,
    get: function() { return 10 },
    set: function(value) { console.log("Setting `o.bar` to", value) }
  }
  });
console.log(o); 

I get invalid property error.


Solution

  • The issue is that writable and set/get are mutually exclusive. The code generates this helpful error in Chrome:

    Invalid property. A property cannot both have accessors and be writable...
    

    This makes some logical sense: if you have set/get accessors on a property, that property is never going to be written to and/or read from, because any attempts to read/write it will be intercepted by the accessor functions. If you define a property as writable and give it accessor functions, you are simultaneously saying:

    1. "The value of this property can be directly altered," and
    2. "Block all attempts to read and/or write to this property; instead, use these functions."

    The error is simply stopping you from specifying a contradiction. I assume from the fact that you wrote a getter and setter, you don't really want the property to be writable. Just remove that line, and your code runs perfectly.