问题
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
.
回答1:
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:
- "The value of this property can be directly altered," and
- "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.
回答2:
Late answer, not looking for votes, but hoping this will be helpful.
There are two kinds of properties. Each property is EITHER:
a data property which has these four attributes:
- value
- writable
- enumerable
- configurable
OR an accessor property which has these four attributes:
- get
- set
- enumerable
- configurable
Therefore there is no property that can have both get
and writable
. That's just the way JavaScript is! Please see section 8.6 of the ECMAScript Standard for the gory details.
来源:https://stackoverflow.com/questions/11681579/object-create-method-in-javascript