5

私は、プロトタイプの継承を実現するために、従来の js の方法の代わりに object.create を使用することにかなり慣れていません。

少なくとも Chrome では、次のコードを見て驚きました。

var baseObject = {
test : function(){
    console.log('Child');
}
}

var newObject = Object.create(baseObject);
newObject.test = function(){
console.log('Parent');
this.__proto__.test();
}
console.log(newObject);

newObject.test();

これを生成します (Web ツールで出力をシミュレートします):

Object {test: function, test: function} 
    test: function (){
    __proto__: Object
        test: function (){
        __proto__: Object
Parent
Child 

したがって、prototype を設定するのではなく、代わりに "__proto__" のみを設定していることがわかります。私のコードでは、適切に継承して親オブジェクトを呼び出すことができますが、「__proto__」のみを使用していることがわかります。"prototype" を使用すると、エラー (未定義) が発生します。

何が起きてる?object.create は、それが標準であるため、代わりに「プロトタイプ」を設定すると考えました(または、私が想定していた)。「__proto__」を使用して入力するのはなぜですか

4

3 に答える 3

5

__proto__非標準であるため、プロトタイプの継承を設定するために使用することは推奨されません。Object.create()これは、特定のプロトタイプ オブジェクトで新しいオブジェクトを作成するために を使用できないという意味ではありません。

.prototypeデフォルトでは、オブジェクトにはプロパティがありません。.prototype関数のオブジェクトを混同しています。

したがって、次のような関数がある場合:

function Foo() {

}

そのFoo関数オブジェクトには、コンストラクターとして呼び出されたときに作成されるオブジェクトの.prototypeとして使用されるオブジェクトを参照するプロパティがあります。__proto__

var f = new Foo();

これで、プロトタイプ チェーンにfが含まれるオブジェクトになりました。;Foo.prototypeを使用してこれを確認できます。Object.getPrototypeOf()

Object.getPrototypeOf(f) === Foo.prototype; // true

これObject.createにより、コンストラクター関数を使用せずに、同じプロトタイプ チェーンをセットアップできるようになります。したがって、これは同等になります。

var f2 = Object.create(Foo.prototype);

これで、元のオブジェクトと同じ方法で設定されたオブジェクトができましたf

Object.getPrototypeOf(f2) === Foo.prototype;            // true
Object.getPrototypeOf(f2) === Object.getPrototypeOf(f); // true

つまり、最終的には同じことを別の方法で行うだけです。オブジェクトとそのプロトタイプ チェーンの間の関係は、内部関係です。非標準__proto__はその関係を暴露するだけです。

于 2013-03-05T21:15:37.277 に答える
0

インスタンスのプロパティは、コンストラクタの__proto__プロパティと同じでなければなりません。 prototype

オブジェクトが作成されると、そのプロパティは内部オブジェクト(つまり、コンストラクターのオブジェクト)__proto__と同じオブジェクトを参照するように設定されます。に新しい値を割り当てると、オブジェクトが拡張不可能な場合を除き、内部プロパティの値も変更されます。[[Prototype]]prototype__proto__[[Prototype]]

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/proto#Description

于 2013-03-05T21:15:48.827 に答える
0

Object.create()その特定のオブジェクト インスタンスのプロトタイプを設定します。 prototypeコンストラクター関数のプロパティであり、そのコンストラクター関数で演算子を使用して作成された各インスタンスの [[Prototype]] として自動的にnew割り当てられるオブジェクトです。

__proto__特定のインスタンスの [[Prototype]] にアクセスする非標準的な方法です。プロトタイプにアクセスする標準的な方法として、Object.getPrototypeOf(this)を呼び出すこともできます。

于 2013-03-05T21:17:17.827 に答える