弃用
This feature is no longer recommended. Though some browsers might still support it, it may have already been removed from the relevant web standards, may be in the process of being dropped, or may only be kept for compatibility purposes. Avoid using it, and update existing code if possible; see the
兼容性表格
at the bottom of this page to guide your decision. Be aware that this feature may cease to work at any time.
警告:
Changing the
[[Prototype]]
of an object is, by the nature of how modern JavaScript engines optimize property accesses, a very slow operation, in
every
browser and JavaScript engine. The effects on the performance of altering inheritance are subtle and far-flung, and are not limited to simply the time spent in
obj.__proto__ = ...
statements, but may extend to
any
code that has access to
any
object whose
[[Prototype]]
has been altered. If you care about performance you should avoid setting the
[[Prototype]]
of an object. Instead, create a new object with the desired
[[Prototype]]
使用
Object.create()
.
警告:
While
Object.prototype.__proto__
is supported today in most browsers, its existence and exact behavior has only been standardized in the ECMAScript 2015 specification as a legacy feature to ensure compatibility for web browsers. For better support, use
Object.getPrototypeOf()
代替。
__proto__
property of
Object.prototype
is an accessor property (a getter function and a setter function) that exposes the internal
[[Prototype]]
(either an object or
null
) of the object through which it is accessed.
The use of
__proto__
is controversial and discouraged. It was never originally included in the ECMAScript language spec, but modern browsers implemented it anyway. Only recently was the
__proto__
property standardized by the ECMAScript 2015 specification for compatibility with web browsers, so it will be supported into the future. It is deprecated in favor of
Object.getPrototypeOf
/
Reflect.getPrototypeOf
and
Object.setPrototypeOf
/
Reflect.setPrototypeOf
(though still, setting the
[[Prototype]]
of an object is a slow operation that should be avoided if performance is a concern).
__proto__
property can also be used in an object literal definition to set the object
[[Prototype]]
on creation, as an alternative to
Object.create()
. See:
对象初始化器/文字句法
.
__proto__
getter function exposes the value of the internal
[[Prototype]]
of an object. For objects created using an object literal, this value is
Object.prototype
. For objects created using array literals, this value is
Array.prototype
. For functions, this value is
Function.prototype
. For objects created using
new fun
, where
fun
is one of the built-in constructor functions provided by JavaScript (
Array
,
布尔
,
Date
,
Number
,
Object
,
String
, and so on — including new constructors added as JavaScript evolves), this value is always
fun.prototype
. For objects created using
new fun
, where
fun
is a function defined in a script, this value is the value of
fun.prototype
. (That is, if the constructor didn't return an other object explicitly, or the
fun.prototype
has been reassigned since the instance was created.)
__proto__
setter allows the
[[Prototype]]
of an object to be mutated. The object must be extensible according to
Object.isExtensible()
: if it is not, a
TypeError
is thrown. The value provided must be an object or
null
. Providing any other value will do nothing.
To understand how prototypes are used for inheritance, see guide article 继承和原型链 .
__proto__
property is a simple accessor property on
Object.prototype
consisting of a getter and setter function. A property access for
__proto__
that eventually consults
Object.prototype
will find this property, but an access that does not consult
Object.prototype
will not. If some other
__proto__
property is found before
Object.prototype
is consulted, that property will hide the one found on
Object.prototype
.
var Circle = function () {};
var shape = {};
var circle = new Circle();
// Set the object prototype.
// DEPRECATED. This is for example purposes only. DO NOT DO THIS in real code.
shape.__proto__ = circle;
// Get the object prototype
console.log(shape.__proto__ === circle); // true
var shape = function () {};
var p = {
a: function () {
console.log('aaa');
}
};
shape.prototype.__proto__ = p;
var circle = new shape();
circle.a(); // aaa
console.log(shape.prototype === circle.__proto__); // true
// or
var shape = function () {};
var p = {
a: function () {
console.log('a');
}
};
var circle = new shape();
circle.__proto__ = p;
circle.a(); // a
console.log(shape.prototype === circle.__proto__); // false
// or
function test() {};
test.prototype.myname = function () {
console.log('myname');
};
var a = new test();
console.log(a.__proto__ === test.prototype); // true
a.myname(); // myname
// or
var fn = function () {};
fn.prototype.myname = function () {
console.log('myname');
};
var obj = {
__proto__: fn.prototype
};
obj.myname(); // myname
| 规范 |
|---|
|
ECMAScript (ECMA-262)
The definition of 'Object.prototype.__proto__' in that specification. |
| Desktop | Mobile | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
__proto__
弃用
|
Chrome 1 | Edge 12 | Firefox 1 | IE 11 | Opera 10.5 | Safari 3 | WebView Android 1 | Chrome Android 18 | Firefox Android 4 | Opera Android 11 | Safari iOS 1 | Samsung Internet Android 1.0 | nodejs Yes |
完整支持
弃用。不要用于新网站。
Object
Object.prototype.__proto__
Object.prototype.constructor
Object.assign()
Object.create()
Object.defineProperties()
Object.defineProperty()
Object.entries()
Object.freeze()
Object.fromEntries()
Object.getOwnPropertyDescriptor()
Object.getOwnPropertyDescriptors()
Object.getOwnPropertyNames()
Object.getOwnPropertySymbols()
Object.getPrototypeOf()
Object.is()
Object.isExtensible()
Object.isFrozen()
Object.isSealed()
Object.keys()
Object.preventExtensions()
Object.prototype.__defineGetter__()
Object.prototype.__defineSetter__()
Object.prototype.__lookupGetter__()
Object.prototype.__lookupSetter__()
Object.prototype.hasOwnProperty()
Object.prototype.isPrototypeOf()
Object.prototype.propertyIsEnumerable()
Object.prototype.toLocaleString()
Object.prototype.toSource()
Object.prototype.toString()
Object.prototype.valueOf()
Object.seal()
Object.setPrototypeOf()
Object.values()
Function