`Object.prototype` 属性表示 `Object` 的原型对象。

`Object.prototype` 属性的属性特性：
writable | true
enumerable | false
configurable | true

## 描述

几乎所有的 JavaScript 对象都是 `Object` 的实例；一个典型的对象继承了`Object.prototype`的属性（包括方法），尽管这些属性可能被遮蔽（亦称为覆盖）。但是有时候可能故意创建不具有典型原型链继承的对象，比如通过`Object.create(null)`创建的对象，或者通过`Object.setPrototypeOf`方法改变原型链。

改变`Object`原型，会通过原型链改变所有对象；除非在原型链中进一步覆盖受这些变化影响的属性和方法。这提供了一个非常强大的、但有潜在危险的机制来覆盖或扩展对象行为。

## 属性

`Object.prototype.constructor`
  特定的函数，用于创建一个对象的原型。
`Object.prototype.__proto__`
  指向当对象被实例化的时候，用作原型的对象。
`Object.prototype.__noSuchMethod__`
  当未定义的对象成员被调用作方法的时候，允许定义并执行的函数。
`Object.prototype.__count__`
  用于直接返回用户定义的对象中可数的属性的数量。已被废除。
`Object.prototype.__parent__`
  用于指向对象的内容。已被废除。

## 方法

`Object.prototype.__defineGetter__()`
  关联一个函数到一个属性。访问该函数时，执行该函数并返回其返回值。
`Object.prototype.__defineSetter__()`
  关联一个函数到一个属性。设置该函数时，执行该修改属性的函数。
`Object.prototype.__lookupGetter__()`
  返回使用 `__defineGetter__` 定义的方法函数 。
`Object.prototype.__lookupSetter__()`
  返回使用 `__defineSetter__` 定义的方法函数。
`Object.prototype.hasOwnProperty()`
  返回一个布尔值 ，表示某个对象是否含有指定的属性，而且此属性非原型链继承的。
`Object.prototype.isPrototypeOf()`
  返回一个布尔值，表示指定的对象是否在本对象的原型链中。
`Object.prototype.propertyIsEnumerable()`
  判断指定属性是否可枚举，内部属性设置参见 ECMAScript [[Enumerable]] attribute 。
`Object.prototype.toSource()`
  返回字符串表示此对象的源代码形式，可以使用此字符串生成一个新的相同的对象。
`Object.prototype.toLocaleString()`
  直接调用 `toString()`方法。
`Object.prototype.toString()`
  返回对象的字符串表示。
`Object.prototype.unwatch()`
  移除对象某个属性的监听。
`Object.prototype.valueOf()`
  返回指定对象的原始值。
`Object.prototype.watch()`
  给对象的某个属性增加监听。
`Object.prototype.eval()`
  在指定对象为上下文情况下执行javascript字符串代码，已经废弃。

## 示例

当改变现有的 Object.prototype method(方法)的行为时，考虑在现有逻辑之前或之后通过封装你的扩展来注入代码。例如,此(未测试的)代码将在内置逻辑或其他人的扩展执行之前 pre-conditionally（预条件地）执行自定义逻辑。

当一个函数被调用时,调用的参数被保留在类似数组 "变量" 的参数中。例如, 在调用 "myFn (a、b、c)"时, 在myFn 的主体内的参数将包含 3个类似数组的元素对应于 (a、b、c)。 使用钩子修改原型时,只需通过调用该函数的 apply ()，将 this 与参数 (调用状态) 传递给当前行为。这种模式可以用于任何原型，如 Node.prototype、 Function.prototype 等.

    var current = Object.prototype.valueOf;

    // 由于我的属性 "-prop-value"是交叉性的, 并不总是
    // 在同一个原型链上，我想要修改 Object.prototype:
    Object.prototype.valueOf = function() {
      if (this.hasOwnProperty('-prop-value')) {
        return this['-prop-value'];
      } else {
        // 它看起来不像我的对象之一，因此，让我们退回到
        // 默认行为，通过尽可能地复制当前行为来实现.
        // 此apply的行为类似于其他语言中的"super".
        // 即使 valueOf() 不带参数, 其他的钩子可能会带有.
        return current.apply(this, arguments);
      }
    }

由于 JavaScript 并不完全具有子类对象, 所以原型是一种有用的变通方法, 可以使用某些函数的 "基类" 对象来充当对象。例如:

    var Person = function(name) {
      this.name = name;
      this.canTalk = true;
    };

    Person.prototype.greet = function() {
      if (this.canTalk) {
        console.log('Hi, I am ' + this.name);
      }
    };

    var Employee = function(name, title) {
      Person.call(this, name);
      this.title = title;
    };

    Employee.prototype = Object.create(Person.prototype);

    Employee.prototype.greet = function() {
      if (this.canTalk) {
        console.log('Hi, I am ' + this.name + ', the ' + this.title);
      }
    };

    var Customer = function(name) {
      Person.call(this, name);
    };

    Customer.prototype = Object.create(Person.prototype);

    var Mime = function(name) {
      Person.call(this, name);
      this.canTalk = false;
    };

    Mime.prototype = Object.create(Person.prototype);

    var bob = new Employee('Bob', 'Builder');
    var joe = new Customer('Joe');
    var rg = new Employee('Red Green', 'Handyman');
    var mike = new Customer('Mike');
    var mime = new Mime('Mime');

    bob.greet();
    // Hi, I am Bob, the Builder

    joe.greet();
    // Hi, I am Joe

    rg.greet();
    // Hi, I am Red Green, the Handyman

    mike.greet();
    // Hi, I am Mike

    mime.greet();

## 规范

Specification | Status | Comment
--- | --- | ---
ECMAScript 1st Edition (ECMA-262) | Standard | Initial definition. Implemented in JavaScript 1.0.
ECMAScript 5.1 (ECMA-262) Object.prototype | Standard |
ECMAScript 2015 (6th Edition, ECMA-262) Object.prototype | Standard |
ECMAScript Latest Draft (ECMA-262) Object.prototype | Draft |

## 浏览器兼容

The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.

Update compatibility data on GitHub

| Desktop | Mobile | Server
| Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | Android webview | Chrome for Android | Edge Mobile | Firefox for Android | Opera for Android | Safari on iOS | Samsung Internet | Node.js
`prototype` | Chrome Full support Yes | Edge Full support Yes | Firefox Full support 1 | IE Full support Yes | Opera Full support Yes | Safari Full support Yes | WebView Android Full support Yes | Chrome Android Full support Yes | Edge Mobile Full support Yes | Firefox Android Full support 4 | Opera Android Full support Yes | Safari iOS Full support Yes | Samsung Internet Android Full support Yes | nodejs Full support Yes

### Legend

Full support
  Full support

## 相关链接

- Introduction to Object-Oriented JavaScript