8

別のオブジェクトのコンストラクターの「this」割り当てを使用する JavaScript オブジェクトを取得しようとしているだけでなく、そのすべてのオブジェクトのプロトタイプ関数を想定しています。これが私が達成しようとしているものの例です:

 /* The base - contains assignments to 'this', and prototype functions
  */
 function ObjX(a,b) {
     this.$a = a;
     this.$b = b;
 }

 ObjX.prototype.getB() {
     return this.$b;
 }

 function ObjY(a,b,c) {
    // here's what I'm thinking should work:
    this = ObjX(a, b * 12); 
    /* and by 'work' I mean ObjY should have the following properties:
     * ObjY.$a == a, ObjY.$b == b * 12,
     * and ObjY.getB == ObjX.prototype.getB
     * ... unfortunately I get the error: 
     *     Uncaught ReferenceError: Invalid left-hand side in assignment
     */

    this.$c = c; // just to further distinguish ObjY from ObjX.
 }

ObjY が ObjX の「this」への割り当てを包含し (つまりthis.$* = *、ObjY のコンストラクターですべての割り当てを繰り返す必要がない)、ObjY が ObjX.prototype を想定する方法について、ご意見をお聞かせください。

私の最初の考えは、次のことを試すことです。

function ObjY(a,b,c) {
   this.prototype = new ObjX(a,b*12);
}

理想的には、プロトタイプの方法でこれを行う方法を学びたいと思います (つまり、Base2のような「古典的な」OOP 代替を使用する必要はありません)。

ObjY が匿名 (例: factory['ObjX'] = function(a,b,c) { this = ObjX(a,b*12); ... }) であることは注目に値するかもしれません。

ありがとうございました。

4

1 に答える 1

19

this定義による値はimmutableであるため、それが参照するものをそのように変更することはできません。

call回避策は、またはapplyメソッドを使用して、 のオブジェクトでObjXコンストラクター関数を実行することです。thisObjY

function ObjY(a,b,c) {
  ObjX.call(this, a, b * 12); 
  this.$c = c;
}

上記の例では、値をObjX変更して関数が実行されるthisため、この関数でそのオブジェクトに加えたすべてのプロパティ拡張は、this値がObjYコンストラクターで参照する新しいオブジェクトに反映されます。

callメソッドが終了するとすぐに、thisオブジェクトが拡張され、値を追加するなど、より多くのプロパティ拡張を作成できます$c

編集:プロトタイプについては、サンプルは機能しません。prototypeプロパティはスタンス内のオブジェクトに対して特別な意味を持たないため、他のプロパティと同じように、コンストラクター関数で使用する必要があります。

コンストラクターのプロパティと、すべてのオブジェクトが持つprototype内部プロパティを混同している可能性があると思います。[[Prototype]]

プロパティはオペレータ[[Prototype]]によってのみ設定でき(内部操作を介して)、このプロパティは変更できません (ただし、Mozilla のような一部の実装では、を介してアクセスできます。ECMAScript 5では、メソッドが導入されています、ただし、直接いじることはお勧めしません)。new[[Construct]]obj.__proto__;Object.getPrototypeOf

実際には、コンストラクター関数が実行される[[Prototype]]と、値が参照するオブジェクトの内部プロパティは、thisコンストラクターのプロパティに既に設定されていprototypeます。

したがって、@Anurag のコメントのObjY.prototypeように、新しく作成されたObjXオブジェクトに を設定できます。

function ObjY(a,b,c) {
  ObjX.call(this, a, b * 12); 
  this.$c = c;
}

ObjY.prototype = new ObjX();
ObjY.prototype.constructor = ObjY;

これにより、 にObjY追加されたプロパティも継承さObjX.prototypeれます。ご覧のとおり、 を変更しました。ObjY.prototype.constructorこれは、上記の行の割り当てにより、このプロパティが誤って を指すようになるためObjXです。

おすすめの記事:

于 2010-03-12T04:56:04.877 に答える