Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% found this document useful (0 votes)
24 views

Object - JavaScript MDN

Uploaded by

sviatdolinskyy32
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
24 views

Object - JavaScript MDN

Uploaded by

sviatdolinskyy32
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 1

References Object

Object

The Object type represents one of


JavaScript's data types. It is used to store
various keyed collections and more complex
entities. Objects can be created using the
Object() constructor or the object initializer /
literal syntax.

Description
Nearly all objects in JavaScript are instances of
Object ; a 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 — the prototype of
Object.prototype is always null and not
changeable.

Object prototype properties


You should avoid calling any Object.prototype
method, 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() , toString() , and


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 and you don't
need to call them yourself in your code.

__defineGetter__() , __defineSetter__() ,
__lookupGetter__() , and
__lookupSetter__() are deprecated and
should not be used. Use the static
alternatives Object.defineProperty() and
Object.getOwnPropertyDescriptor()

instead.

The __proto__ property is deprecated and


should not be used. The
Object.getPrototypeOf() and
Object.setPrototypeOf() alternatives are
static methods.

The propertyIsEnumerable() and


hasOwnProperty() methods can be
replaced with the
Object.getOwnPropertyDescriptor() and
Object.hasOwn() static methods,
respectively.

The isPrototypeOf() method can usually


be replaced with instanceof , if you are
checking the prototype property of a
constructor.

In case where a semantically equivalent static


method doesn't exist, or if you really want to
use the Object.prototype method, you should
directly call() the Object.prototype method
on your target object instead, to prevent the
object from having an overriding property that
produces unexpected results.

JS

const obj = {
foo: 1,
// You should not define such a
method on your own object,
// but you may not be able to
prevent it from happening if
// you are receiving the object from
external input
propertyIsEnumerable() {
return false;
},
};

obj.propertyIsEnumerable("foo"); //
false; unexpected result
Object.prototype.propertyIsEnumerable.
call(obj, "foo"); // true; expected
result

Deleting a property from an object


There isn't any method in an Object itself to
delete its own properties (such as
Map.prototype.delete() ). To do so, one must
use the delete operator.

null-prototype objects
Almost all objects in JavaScript ultimately
inherit from Object.prototype (see inheritance
and the prototype chain). However, you may
create null -prototype objects using
Object.create(null) or the object initializer
syntax with __proto__: null (note: the
__proto__ key in object literals is different from
the deprecated Object.prototype.__proto__
property). You can also change the prototype
of an existing object to null by calling
Object.setPrototypeOf(obj, null) .

JS

const obj = Object.create(null);


const obj2 = { __proto__: null };

An object with a null prototype can behave in


unexpected ways, because it doesn't inherit
any object methods from Object.prototype .
This is especially true when debugging, since
common object-property converting/detecting
utility functions may generate errors, or lose
information (especially if using silent error-
traps that ignore errors).

For example, the lack of


Object.prototype.toString() often makes
debugging intractable:

JS

const normalObj = {}; // create a


normal object
const nullProtoObj =
Object.create(null); // create an
object with "null" prototype

console.log(`normalObj is:
${normalObj}`); // shows "normalObj
is: [object Object]"
console.log(`nullProtoObj is:
${nullProtoObj}`); // throws error:
Cannot convert object to primitive
value

alert(normalObj); // shows [object


Object]
alert(nullProtoObj); // throws error:
Cannot convert object to primitive
value

Other methods will fail as well.

JS

normalObj.valueOf(); // shows {}
nullProtoObj.valueOf(); // throws
error: nullProtoObj.valueOf is not a
function

normalObj.hasOwnProperty("p"); //
shows "true"
nullProtoObj.hasOwnProperty("p"); //
throws error:
nullProtoObj.hasOwnProperty is not a
function

normalObj.constructor; // shows
"Object() { [native code] }"
nullProtoObj.constructor; // shows
"undefined"

We can add the toString method back to the


null-prototype object by assigning it one:

JS

nullProtoObj.toString =
Object.prototype.toString; // since
new object lacks toString, add the
original generic one back

console.log(nullProtoObj.toString());
// shows "[object Object]"
console.log(`nullProtoObj is:
${nullProtoObj}`); // shows
"nullProtoObj is: [object Object]"

Unlike normal objects, in which toString() is


on the object's prototype, the toString()
method here is an own property of
nullProtoObj . This is because nullProtoObj
has no ( null ) prototype.

In practice, objects with null prototype are


usually used as a cheap substitute for maps.
The presence of Object.prototype properties
will cause some bugs:

JS

const ages = { alice: 18, bob: 27 };

function hasPerson(name) {
return name in ages;
}

function getAge(name) {
return ages[name];
}

hasPerson("hasOwnProperty"); // true
getAge("toString"); // [Function:
toString]

Using a null-prototype object removes this


hazard without introducing too much
complexity to the hasPerson and getAge
functions:

JS

const ages = Object.create(null, {


alice: { value: 18, enumerable: true
},
bob: { value: 27, enumerable: true
},
});

hasPerson("hasOwnProperty"); // false
getAge("toString"); // undefined

In such case, the addition of any method


should be done cautiously, as they can be
confused with the other key-value pairs stored
as data.

Making your object not inherit from


Object.prototype also prevents prototype
pollution attacks. If a malicious script adds a
property to Object.prototype , it will be
accessible on every object in your program,
except objects that have null prototype.

JS

const user = {};

// A malicious script:
Object.prototype.authenticated = true;

// Unexpectedly allowing
unauthenticated user to pass through
if (user.authenticated) {
// access confidential data
}

JavaScript also has built-in APIs that produce


null -prototype objects, especially those that
use objects as ad hoc key-value collections.
For example:

The return value of


Array.prototype.group()

The groups and indices.groups properties


of the result of RegExp.prototype.exec()

Array.prototype[@@unscopables] (all
@@unscopables objects should have null -
prototype)

import.meta

Module namespace objects, obtained


through import * as ns from "module"; or
import()

The term " null -prototype object" often also


includes any object without Object.prototype
in its prototype chain. Such objects can be
created with extends null when using classes.

Object coercion
Many built-in operations that expect objects
first coerce their arguments to objects. The
operation can be summarized as follows:

Objects are returned as-is.

undefined and null throw a TypeError .

Number , String , Boolean , Symbol , BigInt


primitives are wrapped into their
corresponding object wrappers.

The best way to achieve the same effect in


JavaScript is through the Object()
constructor. Object(x) converts x to an
object, and for undefined or null , it returns a
plain object instead of throwing a TypeError .

Places that use object coercion include:

The object parameter of for...in loops.

The this value of Array methods.

Parameters of Object methods such as


Object.keys() .

Auto-boxing when a property is accessed


on a primitive value, since primitives do not
have properties.

The this value when calling a non-strict


function. Primitives are boxed while null
and undefined are replaced with the global
object.

Unlike conversion to primitives, the object


coercion process itself is not observable in any
way, since it doesn't invoke custom code like
toString or valueOf methods.

Constructor

Object()

Turns the input into an object.

Static methods

Object.assign()

Copies the values of all enumerable own


properties from one or more source objects
to a target object.

Object.create()

Creates a new object with the specified


prototype object and properties.

Object.defineProperties()

Adds the named properties described by the


given descriptors to an object.

Object.defineProperty()

Adds the named property described by a


given descriptor to an object.

Object.entries()

Returns an array containing all of the [key,


value] pairs of a given object's own
enumerable string properties.

Object.freeze()

Freezes an object. Other code cannot delete


or change its properties.

Object.fromEntries()

Returns a new object from an iterable of


[key, value] pairs. (This is the reverse of
Object.entries ).

Object.getOwnPropertyDescriptor()

Returns a property descriptor for a named


property on an object.

Object.getOwnPropertyDescriptors()

Returns an object containing all own property


descriptors for an object.

Object.getOwnPropertyNames()

Returns an array containing the names of all


of the given object's own enumerable and
non-enumerable properties.

Object.getOwnPropertySymbols()

Returns an array of all symbol properties


found directly upon a given object.

Object.getPrototypeOf()

Returns the prototype (internal


[[Prototype]] property) of the specified
object.

Object.hasOwn()

Returns true if the specified object has the


indicated property as its own property, or
false if the property is inherited or does not
exist.

Object.is()

Compares if two values are the same value.


Equates all NaN values (which differs from
both IsLooselyEqual used by == and
IsStrictlyEqual used by === ).

Object.isExtensible()

Determines if extending of an object is


allowed.

Object.isFrozen()

Determines if an object was frozen.

Object.isSealed()

Determines if an object is sealed.

Object.keys()

Returns an array containing the names of all


of the given object's own enumerable string
properties.

Object.preventExtensions()

Prevents any extensions of an object.

Object.seal()

Prevents other code from deleting properties


of an object.

Object.setPrototypeOf()

Sets the object's prototype (its internal


[[Prototype]] property).

Object.values()

Returns an array containing the values that


correspond to all of a given object's own
enumerable string properties.

Instance properties
These properties are defined on
Object.prototype and shared by all Object
instances.

Object.prototype.__proto__

Points to the object which was used as


prototype when the object was instantiated.

Object.prototype.constructor

The constructor function that created the


instance object. For plain Object instances,
the initial value is the Object constructor.
Instances of other constructors each inherit
the constructor property from their
respective Constructor.prototype object.

Instance methods

Object.prototype.__defineGetter__()

Associates a function with a property that,


when accessed, executes that function and
returns its return value.

Object.prototype.__defineSetter__()

Associates a function with a property that,


when set, executes that function which
modifies the property.

Object.prototype.__lookupGetter__()

Returns the function bound as a getter to the


specified property.

Object.prototype.__lookupSetter__()

Returns the function bound as a setter to the


specified property.

Object.prototype.hasOwnProperty()

Returns a boolean indicating whether an


object contains the specified property as a
direct property of that object and not
inherited through the prototype chain.

Object.prototype.isPrototypeOf()

Returns a boolean indicating whether the


object this method is called upon is in the
prototype chain of the specified object.

Object.prototype.propertyIsEnumerable()

Returns a boolean indicating whether the


specified property is the object's enumerable
own property.

Object.prototype.toLocaleString()

Calls toString() .

Object.prototype.toString()

Returns a string representation of the object.

Object.prototype.valueOf()

Returns the primitive value of the specified


object.

Examples

You might also like