66

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

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

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

のプロトタイプ オブジェクトにアクセスするにはどうすればよいobject1ですか? それを行うブラウザー中立の方法はありますか (つまり、__proto__プロパティに依存しないということですか?このリンクを見ましたが、2010 年以降に新しい開発が行われている可能性があります)。

4

5 に答える 5

118
var f = function();
var instance = new f();

instance クラス 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)プロトタイプを返すために always を使用します)。

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;

    };

  }
}

アップデート:

ECMA-262 第 6 版 (2015 年 6 月) によると、__proto__プロパティは Web ブラウザーの追加機能として標準化されています。トップブラウザのすべての最新版が現在サポートしています。についてもっと読む__proto__

于 2011-10-05T13:50:01.637 に答える
7

のように見えます

Object.getPrototypeOf(passedObject);

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

MDNの互換性表は次のとおりです。

于 2017-08-14T02:14:52.787 に答える
5
var F = function(){};
var object1 = new F();
alert(object1.constructor === F);
alert(object1.constructor.prototype === F.prototype);
于 2011-10-05T13:42:28.387 に答える
1
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
于 2013-05-08T03:58:32.460 に答える