0

更新:2012.06.26-私の元の質問の下にある私の結論を参照してください。

この単純なコードが正しく初期化されない理由を理解しようとしています。はい、私はJavaの世界から来ました。また、「純粋主義者」でもあり、JavaScriptを適切に実行したいと考えています。

多くの(すべてではないにしても)は、「this」キーワードで始まる変数を宣言し、適切なセッターおよびゲッター関数を使用せずにそれらすべての変数を公開することを推奨します。私にとって、これは受け入れられず、OOPの適切な実践を反映していません。JavaScriptはOOP言語だと言われているのに、なぜ人々はいつもこれを回避しようとするのでしょうか。しかし、それは質問ではないので、次に進みましょう...

次のコードの問題は、Chromeで実行すると、次のように表示され続けることです。

Uncaught ReferenceError: x is not defined

デフォルト値を受け入れるコンストラクターを作成することはできますが、オブジェクトを構成するコンストラクターのデフォルト値を公開したくありません(これも良い習慣ではありません)。また、実行時に、setterメソッドが呼び出されて、特定のインスタンスの「x」および「y」の値が変更されます。一度に利用できる「モデル」インスタンスはたくさんあります!

簡単なコードは次のとおりです。

function Model() {
    var x = 3;
    var y = 'hello';
}

Model.prototype.getX = function() {
    return x;
}

Model.prototype.getY = function() {
    return y;
}

Model.prototype.setX = function(myX) {
    x =  myX;
}

Model.prototype.setY = function(myY) {
    y =  myY;
}

var model = new Model();

console.log("Model Y = '" + model.getY() + "'");
console.log("Model X = " + model.getX());
console.log("Model Y = '" + model.getY() + "'");

ご協力いただきありがとうございます...

質問の結論(2012.06.26に更新):

要求されたもの(たまたま非常に単純なもの)はJavaScriptでは実行できないと結論付けるのは非常に簡単です!

私の最大の驚きの考えは、以下の回答からわかるように、JavaScriptはそれをサポートしていないので、それを必要としない、または使用すべきではないと主張する人もいます。うわー、それは本当に素晴らしいです!

私は長年、JavaScriptはOOP言語ではないと主張してきましたが、この簡単な質問(およびその答え)はそれを証明するためのものです。

したがって、最終的には敗北を認めることについて説明します。あなたと私は両方とも、すべてのクラスメンバーに「this」キーワードを使用するようにコードを変更する必要があります。繰り返しになりますが、プログラマーが言語を制御するのではなく、言語がプログラマーを制御します。そして彼らはなぜソフトウェアプロジェクトの2/3以上が毎年失敗するのか疑問に思います!?

4

3 に答える 3

3

1 つの方法は、プロトタイプではなく内部getXで定義することです。getYModel

function Model() {
    var x = 3;
    var y = 'hello';
    this.getX = function(){return x;}
    this.getY = function(){return y;}
    this.setX = function(val){x=val;}
    this.setY = function(val){y=val;}
}

var foo = new Model();
console.log(foo.getX());

他の方法もありますが、これが私の目には最も簡単です。

于 2012-06-25T15:48:33.150 に答える
2
function Model() {
    var x = 3;
    var y = 'hello';
}

これにより、ローカル(役に立たない)変数xが作成されますが、新しく作成されたModelのインスタンスのプロパティが必要です。

使用する

  function Model() {
    this.x = 3;
    this.y = 'hello';
}

Model.prototype.setY = function(myY) {
    y =  myY;
}

これはあなたの財産を変更しません。使用する

Model.prototype.setY = function(myY) {
    this.y =  myY;
}

はい、javascriptとjavaは大きく異なります。プライバシーを強制しようとするのではなく、規則(_で始まるプライベートフィールドの呼び出しなど)を優先します。

于 2012-06-25T15:39:53.123 に答える
-2

使用する必要がありますthis

Model.prototype.getX = function() {
    return this.x;
}
于 2012-06-25T16:13:29.037 に答える