ラファエレはすでにあなたの質問のほとんどに答えていると思います。しかし、便宜上、別の方法で表現し、従うべきコードをいくつか追加してみましょう。
コードがそのように動作する理由を理解するために、ここで学ぶことができることが 2 つあります。
JavaScript には の遅延バインディングがありthis
ます。メソッドを呼び出す場合にのみ、ランタイムは呼び出されるオブジェクトを「オン」に決定します。デフォルトはグローバル オブジェクトです (例:window
ブラウザ、global
node.js など)。this
グローバル以外のものを取得するには、 を介して行ったように、目的のオブジェクトのプロパティとして関数を割り当てる必要がありthis.publicAlert = privateAlert;
ます。その後、同じ関数であっても、privateAlert()
( global で) 直接this
呼び出すか、 this を介してローカルで呼び出すかによって違いが生じます。this.publicAlert()
すでに他の回答で指摘されているように。Javascript には 、 などはありませんpublic
。private
スマート スコープを使用して行ったように、プライベート変数を「モデル化」する必要があります。あなたの例でprivateVal
は、誰も外部から読み書きできないという意味でプライベートです。についても同様ですprivateAlert
。Foo
コンストラクターとメソッドのステートメントを介してのみ、run
それらにアクセスできます。
何が起こっているかを示すためにあなたの例を拡張しました(ps:console.log
通常、使用するよりも使用する方がはるかに賢明ですalert
):
function Foo() {
var privateVal = "Private Val";
var that = this;
this.publicVal = "Public Val";
var privateAlert = function (str) {
console.log("---" + str + "---")
console.log("isLocalThis? ", this == that)
console.log("isGlobalThis?", this == globalThis)
console.log("private: ", privateVal)
console.log("public: ", this.publicVal || "publicVal not available on 'this'")
}
this.run = function () {
console.log("scope of run:", that, bar, privateAlert)
console.log("isLocalThis? ", this == that)
console.log("isGlobalThis?", this == globalThis)
privateAlert("Private Call: ");
this.publicAlert = privateAlert;
this.publicAlert("Public Call: ");
privateAlert = this.publicAlert;
privateAlert("Private Call: ");
this.publicAlert("Public Call: ");
}
}
var bar = new Foo();
bar.run();
ところで:console
とalert
グローバルのプロパティthis
(つまり、window
)。