Object.prototype

Object.prototypeObject コンストラクターのプロパティです。プロトタイプチェーンの末尾でもあります。

Object.prototype のプロパティ属性
書込可能 不可
列挙可能 不可
設定可能 不可

説明

JavaScript におけるほぼすべてのオブジェクトは Object のインスタンスです。たいていのオブジェクトは、プロパティを (メソッドを含み) Object.prototype から継承していますが、隠されている (つまり、上書きされている) こともあります。しかし、これに該当しない Object が意図的に作成されたり (例えば 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]] 属性 の設定状態を示す真偽値を返します。
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 メソッドの動作を変更する場合は、既存のロジックの前後を囲む拡張コードを挿入するようにしてください。例えば、この (未テストの) コードは、組み込みロジックまたは他の誰かの拡張機能が実行される前に、事前に条件付きで独自オンロジックを実行します。

関数が呼び出されると、呼び出す引数は配列風「変数」 arguments に保持されます。例えば "myFn(a, b, c)" の呼び出しでは、 myFn の本体内での引数は (a, b, c) に対応する3つの配列風要素を含みます。フックでプロトタイプを変更すると、単純にこれと引数 (呼び出し時の状態) を渡し、関数で apply() を呼び出して現在の動作の引数 (呼び出し状態) を返します。 このパターンは、 Node.prototype, Function.prototype, などのプロトタイプに使用できます。

var current = Object.prototype.valueOf;

// Since my property "-prop-value" is cross-cutting and isn't always
// on the same prototype chain, I want to modify Object.prototype: 
Object.prototype.valueOf = function() {
  if (this.hasOwnProperty('-prop-value')) {
    return this['-prop-value'];
  } else {
    // It doesn't look like one of my objects, so let's fall back on 
    // the default behavior by reproducing the current behavior as best we can.
    // The apply behaves like "super" in some other languages.
    // Even though valueOf() doesn't take arguments, some other hook may.
    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.constructor = Employee; //If you don't set Object.prototype.constructor to Employee, 
                                           //it will take prototype.constructor of Person (parent). 
                                           //To avoid that, we set the prototype.constructor to Employee (child).


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);
Customer.prototype.constructor = Customer; //If you don't set Object.prototype.constructor to Customer, 
                                           //it will take prototype.constructor of Person (parent). 
                                           //To avoid that, we set the prototype.constructor to Customer (child).


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

Mime.prototype = Object.create(Person.prototype);
Mime.prototype.constructor = Mime; //If you don't set Object.prototype.constructor to Mime,
                                   //it will take prototype.constructor of Person (parent).
                                   //To avoid that, we set the prototype.constructor to Mime (child).


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();

仕様書

仕様書 状態 備考
ECMAScript Latest Draft (ECMA-262)
Object.prototype の定義
ドラフト
ECMAScript 2015 (6th Edition, ECMA-262)
Object.prototype の定義
標準
ECMAScript 5.1 (ECMA-262)
Object.prototype の定義
標準
ECMAScript 1st Edition (ECMA-262) 標準 初回定義。 JavaScript 1.0 で実装。

ブラウザーの互換性

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
prototypeChrome 完全対応 ありEdge 完全対応 ありFirefox 完全対応 1IE 完全対応 ありOpera 完全対応 ありSafari 完全対応 ありWebView Android 完全対応 ありChrome Android 完全対応 ありFirefox Android 完全対応 4Opera Android 完全対応 ありSafari iOS 完全対応 ありSamsung Internet Android 完全対応 ありnodejs 完全対応 あり

凡例

完全対応  
完全対応

関連情報