2011-07-25 16 views
2

javascriptを使用すると、あるオブジェクトが別のオブジェクトからプロパティを継承するようにすることができます。そのため、最初のオブジェクトにプロパティが見つからない場合、2番目のオブジェクトが検索されます。 prototypeプロパティをコンストラクタ関数に再割り当てすることにより、プロパティを検索する多くのオブジェクトのチェーンを作成できます。例えばあるコンストラクタ関数のプロパティを別のコンストラクタ関数に継承することは可能ですか?

var X = function() {}; 
X.prototype.x = "x"; 

var Y = function() {}; 
Y.prototype = new X(); 
Y.prototype.y = "y"; 

var z = new Y(); 
z.z = "z"; 

/////////////// 

console.log(z.z); // searches z for property 'z', finds it and returns 'z' 

console.log(z.y); // searches z, fails, searches z.[[hidden_prototype]] 
        // (which is Y.prototype), finds it and returns 'y' 

console.log(z.x); // searches z, fails, searches Y.prototype, fails, 
        // searches Y.prototype.[[hidden_prototype]] 
        // (which is X.prototype), finds it and returns "x" 

私は上記のコードでXYすなわち、コンストラクタ関数のプロパティにそれを拡張することが可能であったかどうかも疑問に思いました。

X.val = 42; 

console.log(Y.val); // returns 42 

Y.[[hidden_prototype]] === X場合、これは動作しますが、私はXYもする必要がある場合という設定方法が分からない:たとえば、次のようにも動作するように上記のコードを変更する方法がありますコンストラクタ関数

答えて

1

最初の関連link

によると、あなたのような何かを行うことができますDouglas Crockfordによって「beget」として一般化されました。

var clone = (function() { 
    var f = function(){}; 
    return function(obj) { 
    f.prototype = obj; 
    return new f(); 
    } 
}()); 

はY [[プロトタイプ]]としてXを設定する:

function X(){} 
var Y = clone(X); 

ただしYは、オブジェクト、機能しないであろう。関数は、関数コンストラクタによってのみ作成できます。新しい関数の作成方法はECMA-262で定義されていますが、関数はFunction.prototypeとObject.prototypeを継承しなければならないので、[[Prototype]]オブジェクトとして使用するオブジェクトには影響を与えません。 [[Prototype]]として挿入されるオブジェクト。

+0

ありがとうございました。私が知りたかったことですが、質問をタイプしたときに関連リンクが表示されませんでした。見た目では、可能な回答リストはタイトルだけでなくテキストの内容によっても更新されます。質問を入力した後で再度チェックしてください:) –

+2

非標準で廃止予定の__proto__プロパティは使用しないでください。これは広くサポートされておらず、将来サポートするブラウザからは削除されます。 – RobG

0

あなたが最初のラッセライヒシュタインニールソンとによって開発されたクローン機能を使用することができます明らかに標準ではありませんが

function Y(){} 
function X(){} 
Y.__proto__=X; 
X.val=42; 
console.log(Y.val);//42 

関連する問題