1

少しダンプを感じますが、JavaScriptでのプロトタイピングについて理解できない(または可能かどうかさえわからない)ことがあります。
疑似クラスのプロトタイプを作成しているときにメソッドを使用したいのですが:

var Class = function() {}
Class.prototype = {
    a: function() {
        return 'ok'
    }
  , z: Class.prototype.a() // I tried with `this`/`constructor`/etc.
} // TypeError: Object [object Object] has no method 'a' the rest isn't evaluated
var test = new Class()
test.z

私はこの方法でそれを行うことができることを知っていますが、それでもできるかどうかを知りたいのですが、Class.prototype宣言内のすべてのメソッド/プロパティ:

var Class = function() {}
Class.prototype.a = function() {
    return 'ok'
}
Class.prototype.z = Class.prototype.a()
var test = new Class()
test.z // "ok"

ありがとう。

4

4 に答える 4

2

いいえ、できません。オブジェクトを定義するステートメントが終了する前にオブジェクトのプロパティを参照できないのと同じように、次のようになります。

var x = {
    y: 10,
    z: x.y + 5 // TypeError, cannot read property `y` of undefined
};

代入式全体が評価されるまで、変数xには値がありません(宣言が引き上げられているため、宣言されていますが、値はです) 。undefined

于 2012-11-15T13:53:07.477 に答える
1

はい、できます。Class次のように割り当てることができます。

var Class = function() {
 if (!Class.prototype.a){
  var proto = Class.prototype;
  proto.a = function() {
     return 'ok';
  };
  proto.z = proto.a();
 }
}

var test = new Class;
console.log(test.z); //=> "ok"

別のオプションは、シングルトンを使用してプロトタイプのプロパティ/メソッドを作成することです。

var Class = function(){};
Class.prototype = function(){
  function a(){return 'ok';}
  return {a: a, z: a()};
}();
var test = new Class;
console.log(test.z); //=> "ok"
于 2012-11-15T13:59:28.393 に答える
1

追加するプロパティが1つしかない場合は、次のように実行できます。

(Class.prototype = {
    a: function() {
        return 'ok'
    }
}).z = Class.prototype.a();

または、匿名関数を一時的なコンストラクターとして使用するこのアプローチを取ることもできます。

Class.prototype = new function() {
    this.a = function() {
        return 'ok'
    }
    this.z = this.a()
}
于 2012-11-15T14:09:55.497 に答える
0

まず、受け入れられた答えは間違っています。あなたはできる。

第二に:次のパターンを見たことがありますか?

Class.prototype = {
    constructor: Class
};

を使用して現在のオブジェクトにアクセスする場合は、このconstructorプロパティが必要ですthis

3番目:プロパティ関数を使用していない場合、コンテキストはwindowundefined厳密モードでは)、オブジェクトではありません。

4番目:これはあなたが探しているものです:

function Class() {}

Class.prototype = {
    constructor: Class, // required!

    a: function() {
        return 'ok';
    },

    z: function() {
        // 'this' is the object *in* the function
        return this.a();
    }
};

var o = new Class();
console.log(o.z()); // "ok"
于 2012-11-15T14:21:21.360 に答える