We're looking for a user researcher to understand the needs of developers and designers. Is this you or someone you know? Check out the post: https://mzl.la/2IGzdXS

Object.setPrototypeOf() メソッドは指定されたオブジェクトのプロトタイプ(例えば内部の [[Prototype]]  プロパティ)を、別のオブジェクトまたは null に設定します。

警告: オブジェクトの [[Prototype]] を変化させることは、最新の JavaScript エンジンがプロパティアクセスを最適化する性質によって、すべてのブラウザや JavaScript エンジンにおいて、とても低速な操作です。プロトタイプを変化させることの性能上の影響は、微細で広範囲にわたり、単に Object.setPrototypeOf に費やされる時間に制限はありません。しかし、[[Prototype]] が変化するすべてののオブジェクトへのアクセスを持つすべてのコードを拡張します。性能を気にしている場合、オブジェクトの [[Prototype]] を変化させることを避けるべきです。かわりに、Object.create() を使用して望み通りの [[Prototype]] をもつオブジェクトを生成してください。

構文

Object.setPrototypeOf(obj, prototype);

引数

obj
プロトタイプとして設定されるオブジェクト。
prototype
オブジェクトの新しいプロトタイプ(オブジェクトまたは null)。

返り値

指定されたオブジェクト。

説明

[[Prototype]] が変更されるオブジェクトが Object.isExtensible() に応じて拡張不可の場合、TypeError 例外をスローします。prototype 引数がオブジェクトまたは null ではない場合(例 数値、文字列、boolean、undefined)、何もしません。さもなければ、このメソッドは obj の [[Prototype]] を新しい値に変更します。

Object.setPrototypeOf()は、ECMAScript 2015 仕様にあります。一般的には、オブジェクトのプロトタイプを設定するための適切な方法と考えられています。もっと物議を醸すObject.prototype.__proto__ プロパティがあります。

var dict = Object.setPrototypeOf({}, null);

ポリフィル

Object.setPrototypeOf が利用できない場合、より古い Object.prototype.__proto__ プロパティを使って、簡単に定義することができます。

Object.setPrototypeOf = Object.setPrototypeOf || function(obj, proto) {
  obj.__proto__ = proto;
  return obj; 
}

プロトタイプチェーンの追加

Object.getPrototypeOf()Object.prototype.__proto__ の組み合わせによってプロトタイプチェーン全体を新しいプロトタイプオブジェクトに追加できます。

/**
*** Object.appendChain(@object, @prototype)
*
* Appends the first non-native prototype of a chain to a new prototype.
* Returns @object (if it was a primitive value it will transformed into an object).
*
*** Object.appendChain(@object [, "@arg_name_1", "@arg_name_2", "@arg_name_3", "..."], "@function_body")
*** Object.appendChain(@object [, "@arg_name_1, @arg_name_2, @arg_name_3, ..."], "@function_body")
*
* Appends the first non-native prototype of a chain to the native Function.prototype object, then appends a
* new Function(["@arg"(s)], "@function_body") to that chain.
* Returns the function.
*
**/

Object.appendChain = function(oChain, oProto) {
  if (arguments.length < 2) { 
    throw new TypeError('Object.appendChain - 引数が足りません');
  }
  if (typeof oProto !== 'object' && typeof oProto !== 'string') {
    throw new TypeError('Object.appendChain の第二引数は object か string でなければなりません');
  }

  var oNewProto = oProto,
      oReturn = o2nd = oLast = oChain instanceof this ? oChain : new oChain.constructor(oChain);

  for (var o1st = this.getPrototypeOf(o2nd);
    o1st !== Object.prototype && o1st !== Function.prototype;
    o1st = this.getPrototypeOf(o2nd)
  ) {
    o2nd = o1st;
  }

  if (oProto.constructor === String) {
    oNewProto = Function.prototype;
    oReturn = Function.apply(null, Array.prototype.slice.call(arguments, 1));
    this.setPrototypeOf(oReturn, oLast);
  }

  this.setPrototypeOf(o2nd, oNewProto);
  return oReturn;
}

使用

最初の例: チェーンをプロトタイプに追加する

function Mammal() {
  this.isMammal = 'yes';
}

function MammalSpecies(sMammalSpecies) {
  this.species = sMammalSpecies;
}

MammalSpecies.prototype = new Mammal();
MammalSpecies.prototype.constructor = MammalSpecies;

var oCat = new MammalSpecies('Felis');

console.log(oCat.isMammal); // 'yes'

function Animal() {
  this.breathing = 'yes';
}

Object.appendChain(oCat, new Animal());

console.log(oCat.breathing); // 'yes'

二番目の例: そのコンストラクタのインスタンスにプリミティブ値を変換し、プロトタイプにそのチェーンを追加する

function MySymbol() {
  this.isSymbol = 'yes';
}

var nPrime = 17;

console.log(typeof nPrime); // 'number'

var oPrime = Object.appendChain(nPrime, new Symbol());

console.log(oPrime); // '17'
console.log(oPrime.isSymbol); // 'yes'
console.log(typeof oPrime); // 'object'

三番目の例: チェーンを Function.prototype オブジェクトに追加し、新しい関数をそのチェーンに追加する

function Person(sName) {
  this.identity = sName;
}

var george = Object.appendChain(new Person('George'),
                                'console.log("Hello guys!!");');

console.log(george.identity); // 'George'
george(); // 'Hello guys!!'

仕様

仕様 状況 コメント
ECMAScript 2015 (6th Edition, ECMA-262)
Object.setPrototypeOf の定義
標準 初期定義。
ECMAScript Latest Draft (ECMA-262)
Object.setPrototypeOf の定義
ドラフト  

ブラウザ実装状況

機能ChromeEdgeFirefoxInternet ExplorerOperaSafari
基本対応34 あり3111 あり9
機能Android webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
基本対応 あり あり あり31 あり あり あり

関連情報

ドキュメントのタグと貢献者

このページの貢献者: woodmix, sii, shide55
最終更新者: woodmix,