typical object inherits properties
(including methods) from ` Object.prototype ` , although these properties may
be shadowed (a.k.a. overridden). The only objects that don't inherit from `
Object.prototype ` are those with  ` null ` prototype  , or descended from
other ` null ` prototype objects.

Changes to the ` Object.prototype ` object are seen by **all** objects through
prototype chaining, unless the properties and methods subject to those changes
are overridden further along the prototype chain. This provides a very
powerful although potentially dangerous mechanism to override or extend object
behavior. To make it more secure, ` Object.prototype ` is the only object in
the core JavaScript language that has [ immutable prototype ](/en-
US/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf#description)
â the prototype of ` Object.prototype ` is always ` null ` and not
changeable.

###  Object prototype properties

You should avoid calling any ` Object.prototype ` method directly from the
instance, especially those that are not intended to be polymorphic (i.e. only
its initial behavior makes sense and no descending object could override it in
a meaningful way). All objects descending from ` Object.prototype ` may define
a custom own property that has the same name, but with entirely different
semantics from what you expect. Furthermore, these properties are not
inherited by  ` null ` -prototype objects  . All modern JavaScript utilities
for working with objects are  static  . More specifically:

  * [ ` valueOf() ` ](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf) , [ ` toString() ` ](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString) , and [ ` toLocaleString() ` ](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toLocaleString) exist to be polymorphic and you should expect the object to define its own implementation with sensible behaviors, so you can call them as instance methods. However, ` valueOf() ` and ` toString() ` are usually implicitly called through [ type conversion ](/en-US/docs/Web/JavaScript/Data_structures#type_coercion) and you don't need to call them yourself in your code. 
  * [ ` __defineGetter__() ` ](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/__defineGetter__) , [ ` __defineSetter__() ` ](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/__defineSetter__) , [ ` __lookupGetter__() ` ](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/__lookupGetter__) , and [ ` __lookupSetter__() ` ](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/__lookupSetter__) are deprecated and should not be used. Use the static alternatives [ ` Object.defineProperty() ` ](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty) and [ ` Object.getOwnPropertyDescriptor() ` ](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor) instead. 
  * The [ ` __proto__ ` ](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto) property is deprecated and should not be used. The [ ` Object.getPrototypeOf() ` ](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getPrototypeOf) and [ ` Object.setPrototypeOf() ` ](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf) alternatives are static methods. 
  * The [ ` propertyIsEnumerable() ` ](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/propertyIsEnumerable) and [ ` hasOwnProperty() ` ](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty) methods can be replaced with the [ ` Object.getOwnPropertyDescriptor() ` ](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor) and [ ` Object.hasOwn() ` ](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwn) static methods, respectively. 
  * The [ ` isPrototypeOf() ` ](/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isPrototypeOf) method can usually be replaced with [ ` inst