5

次のコードからの私の期待は、チェックa.nameすると、プロトタイプを検索し、宣言されたとおりに返すことです。JSが私のプロトタイプを承認するのを妨げているのは誰かを特定できますか?

var obj = function(parent){
    return {
        prototype: parent
    }
};

var me = { name: 'keith' };

var a = new obj(me)
// => undefined

a.name
// => undefined

a.prototype.name
// => "keith"
4

5 に答える 5

1

関数では、関数プロトタイプに触れていません。親を値として持つプロパティ「prototype」を持つ新しいオブジェクトを返すだけです。したがって、そのプロパティを介してのみアクセスできます。

あなたは継承を実装しようとしているようです、それについての良い読み物があります: JavaScriptのプロトタイプの継承とJavaScript古典的な継承

于 2012-10-26T04:17:35.343 に答える
1

「prototype」という名前のプロパティは単なるプロパティであり、オブジェクトの継承元のオブジェクトを指していません。Object.getPrototypeOfまたは非標準__proto__プロパティを使用して取得します。

したがって、関数obj(me)が返すのは、文字列を指すプロパティ「name」を持つオブジェクトを指すプロパティ「prototype」を持つオブジェクトkeithです。関数はオブジェクトを返すため、newキーワードを使用して呼び出されても呼び出されなくても違いはありません。

継承の場合、コンストラクター関数[object]の「prototype」プロパティが問題になります。このコンストラクターによって作成された(オブジェクトを返さない)すべてのオブジェクトは、キーワードを使用して、コンストラクターnewの「プロトタイプ」プロパティが指すオブジェクトから継承します。だからあなたはこれを行うことができます:

var Constructor = function() {
    console.log(this); // logs the currently created object
    // return nothing
}
Constructor.prototype = { name: 'keith' };

var a = new Constructor(); // logs an empty object
Object.getPrototypeOf(a) === Constructor.prototype; // true
a.name; // "keith" - inherited
于 2012-10-26T05:37:25.150 に答える
0

「値」prototypeを上書きするのと同じように、プロパティを上書きしているのではないかと思います。undefined

于 2012-10-26T04:02:29.223 に答える
0

ここでの問題prototypeは、オブジェクトである値parentで名前が付けられたプロパティを返すため、ペアprototype = {name = 'keith'}を返し、new objを呼び出すときに、aという名前の新しいプロパティのプロトタイプに追加することですprototype

あなたは少し変更が必要です、私はこれがあなたがやろうとしていることである必要があります。これは機能しますが、オーバーロードプロパティに注意してください。

var obj = function(parent){
   for(var propt in parent){
      this[propt] = parent[propt];
   }
}

var me = { name: 'keith' };
var a = new obj(me);
console.log(a);
// => Object { name="keith"}
console.log(a.name);
// => "keith"

編集:プロトタイプを使用して継承を探している場合は、これを読むか、新しいjavascriptタイプのOOライブラリであるTypeScriptを試してください。

于 2012-10-26T04:42:11.143 に答える
-1

あなたは本物のプロトタイプを偽物で上書きしたようです。

于 2012-10-26T04:03:33.783 に答える