web-dev-qa-db-ja.com

javascriptでオブジェクトプロトタイプにアクセスする方法は?

すべての記事で、JavaScriptはプロトタイプベースの言語であると書かれています。つまり、すべてのオブジェクトにはプロトタイプ(より正確にはプロトタイプチェーン)があります。

これまでのところ、次のコードスニペットを試しました。

var F = function();
F.prototype.member1 = 1;
var object1 = new F();
console.log(object1.member1); // prints 1

object1のプロトタイプオブジェクトにアクセスするにはどうすればよいですか?それを行うためのブラウザに中立な方法はありますか(つまり、__proto__プロパティに依存しないということですか? this リンクを参照してください。しかし、2010年以降に新しい開発があるかもしれません)フードの背後にある理論的根拠を教えてください。

57
BreakPhreak
_var f = function();
var instance = new f();
_

instanceclass functionの名前がわかっている場合、次のようにプロトタイプに簡単にアクセスできます。

_var prototype = f.prototype;
prototype.someMember = someValue;
_

しない場合:

1)

_var prototype = Object.getPrototypeOf(instance);
prototype.someMember = someValue;
_

2)または

_var prototype = instance.__proto__;
prototype.someMember = someValue;
_

3)または

_var prototype = instance.constructor.prototype; // works only if constructor is properly assigned and not modified
prototype.someMember = someValue;
_

互換性のために、コードに次のスニペットを配置できます(そして、プロトタイプを返すために常にObject.getPrototypeOf(instance)を使用します):

_if(!Object.getPrototypeOf) {

  if(({}).__proto__ === Object.prototype && ([]).__proto__ === Array.prototype) {

    Object.getPrototypeOf = function getPrototypeOf(object) {
      return object.__proto__;
    };

  } else {

    Object.getPrototypeOf = function getPrototypeOf(object) {

      // May break if the constructor has been changed or removed
      return object.constructor ? object.constructor.prototype : void 0;

    };

  }
}
_

UPDATE:

ECMA-262 6th Edition(2015年6月)によれば、___proto___プロパティはWebブラウザーの追加機能として標準化されています。上位ブラウザのすべての最新版が現在サポートしています。 ___proto___の詳細を読む:

105
Andrew D.

のように見えます

Object.getPrototypeOf(passedObject);

これで動作し、最新のブラウザと互換性があります。

MDNの互換性テーブル

5
HelloWorld
var F = function(){};
var object1 = new F();
alert(object1.constructor === F);
alert(object1.constructor.prototype === F.prototype);
5
user652649
var F = function();
F.prototype.member1 = 1;
F.prototype.getClass = F;

var object1 = new F();
object1.member1 = 2;

console.log(object1.getClass.prototype.member1); // prints 1
console.log(object1.member1); // prints 2
1
r3mark