すべての記事で、JavaScriptはプロトタイプベースの言語であると書かれています。つまり、すべてのオブジェクトにはプロトタイプ(より正確にはプロトタイプチェーン)があります。
これまでのところ、次のコードスニペットを試しました。
var F = function();
F.prototype.member1 = 1;
var object1 = new F();
console.log(object1.member1); // prints 1
object1
のプロトタイプオブジェクトにアクセスするにはどうすればよいですか?それを行うためのブラウザに中立な方法はありますか(つまり、__proto__
プロパティに依存しないということですか? this リンクを参照してください。しかし、2010年以降に新しい開発があるかもしれません)フードの背後にある理論的根拠を教えてください。
_var f = function();
var instance = new f();
_
instance
class 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__
_の詳細を読む:
EDMA-262 6th Edition(2015年6月): _B.2.2.1 Object.prototype.__proto__
_
var F = function(){};
var object1 = new F();
alert(object1.constructor === F);
alert(object1.constructor.prototype === F.prototype);
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