A non-writable data property on the prototype prevents an assignment from creating a shadowing own property on the instance. The write is rejected (and throws in strict mode). So f.x continues to resolve to the inherited 1, and f.hasOwnProperty("x") is false because no own property was ever created. Writability on the prototype controls whether instances can shadow it.