ECMAScript အပေါင်း အဆို

作用域指的是变量的适用范围。

公用、私有和受保护作用域

概念

在传统的面向对象程序设计中,主要关注于公用和私有作用域。公用作用域中的对象属性可以从对象外部访问,即开发者创建对象的实例后,就可使用它的公用属性。而私有作用域中的属性只能在对象内部访问,即对于外部世界来说,这些属性并不存在。这意味着如果类定义了私有属性和方法,则它的子类也不能访问这些属性和方法。

受保护作用域也是用于定义私有的属性和方法,只是这些属性和方法还能被其子类访问。

ECMAScript 只有公用作用域

对 ECMAScript 讨论上面这些作用域几乎毫无意义,因为 ECMAScript 中只存在一种作用域 - 公用作用域。ECMAScript 中的所有对象的所有属性和方法都是公用的。因此,定义自己的类和对象时,必须格外小心。记住,所有属性和方法默认都是公用的!

建议性的解决方法

许多开发者都在网上提出了有效的属性作用域模式,解决了 ECMAScript 的这种问题。

အကြမ်းအားလျှင် လျှပ်ပျက် ပုံးနှိပ် ကြောင်း ကို သတ်မှတ်ထား သော်လည်း သုံးစွဲသူများ သည် အခြေအထိုး နှင့် စက်ဆုံး သည် မဟုတ် သေးသည်။ အခြေအထိုး နှင့် စက်ဆုံး ကို သတ်မှတ်ထား သည် အခြေအထိုး နှင့် စက်ဆုံး အပါအဝင် သည် မဟုတ် သေးသည်။

obj._color_ = "blue";

ဒါက လုပ်စရ်တွင် အခြေအထိုး color သည် လျှပ်ပျက်သည်။ ကိုယ်စားပြုထားသည် သည် အခြေအထိုး ကို အကြမ်းတက် ပြောဆိုသည် မဟုတ် သေးသည်။ အမှတ်ပြု မှတ်သားထားသည် သည် အခြေအထိုး အများပြား ကို အကြမ်းတက် ပြောဆိုသည် မဟုတ် သေးသည်။

有些开发者还喜欢用单下划线说明私有成员,例如:obj._color。

静态作用域

静态作用域定义的属性和方法任何时候都能从同一位置访问。在 Java 中,类可具有属性和方法,无需实例化该类的对象,即可访问这些属性和方法,例如 java.net.URLEncoder 类,它的函数 encode() 就是静态方法。

ECMAScript 没有静态作用域

严格来说,ECMAScript 并没有静态作用域。不过,它可以给构造函数提供属性和方法。还记得吗,构造函数只是函数。函数是对象,对象可以有属性和方法。例如:

function sayHello() {
  alert("hello");
}
sayHello.alternate = function() {
  alert("hi");
}
sayHello();		//输出 "hello"
sayHello.alternate();	//输出 "hi"

TIY

这里,方法 alternate() 实际上是函数 sayHello 的方法。可以像调用常规函数一样调用 sayHello() 输出 "hello",也可以调用 sayHello.alternate() 输出 "hi"。即使如此,alternate() 也是 sayHello() 公用作用域中的方法,而不是静态方法。

အကြွပ်အကြွန်းအရာရှိ this

this ကို အသုံးပြုခြင်း၏ အရည်အချင်း

ECMAScript တွင် အကြောင်းအရာများအနက် အကြောင်းအရာတစ်ခုခု ဖြစ်သော အကြွပ်အကြွန်းအရာရှိ this ကို အသုံးပြုခြင်း ကို တွေ့ပါလိုက်သည်။ အကြွပ်အကြွန်းအရာရှိ this ကို ပုဂ္ဂိုလ်အရာရှိ၏ ပုဂ္ဂိုလ်အရာရှိ တွင် အသုံးပြုပြီး အကြွပ်အကြွန်းအရာရှိ this ကို အတူတူကြောင်းဖြစ်သည်။ အကြွပ်အကြွန်းအရာရှိ this ကို အသုံးပြုခြင်း အခြားအခါ၌ အသုံးပြုခြင်းနှင့် အတူတူဖြစ်သည်။

var oCar = new Object;
oCar.color = "red";
oCar.showColor = function() {
  alert(this.color);
};
oCar.showColor();		//ပြောကြားပါ "red"

TIY

အဆိုပါအခါ၌ အကြွပ်အကြွန်းအရာရှိ this ကို ပုဂ္ဂိုလ်အရာရှိ၏ showColor() ပုဂ္ဂိုလ်အရာရှိ တွင် အသုံးပြုသည်။ အဆိုပါအခါ၌ အကြွပ်အကြွန်းအရာရှိ this ကို oCar ကို အတူတူကြောင်းဖြစ်သည်။ အဆိုပါအခါ၌ အကြွပ်အကြွန်းအရာရှိ this ကို အသုံးပြုခြင်း အခြားအခါ၌ အသုံးပြုခြင်းနှင့် အတူတူဖြစ်သည်။

var oCar = new Object;
oCar.color = "red";
oCar.showColor = function() {
  alert(oCar.color);
};
oCar.showColor();		//ပြောကြားပါ "red"

TIY

this ကို အသုံးပြုခြင်း၏ အကြောင်းအရာ

ဒါကို သို့မဟုတ်ဘူး ယုံးလုံးအတွက် this ကို အသုံးပြုသည်ဟု ပြောရမည်မဟုတ်၊ အဆိုပါအခါ၌ ကိုယ်စားပြုရန် ပုဂ္ဂိုလ်အရာရှိ သုံးနေရသေးသည်။ this ကို အသုံးပြု၍ တစ်ခုတည်းသော ပုဂ္ဂိုလ်အရာရှိ ကို အချိန်ကိုယ်တိုင် ပြန်ဖွဲ့စည်းခြင်းကို အသုံးပြုကာ ပြန်ဖွဲ့စည်းခြင်းကို လုပ်ကိုင်နိုင်ပါ၏။ အဆိုပါအခါ၌ ပြင်ဆင်ချက်တစ်ခုကို စိတ်ကူးလိုက်သည်မဟုတ်။

function showColor() {
  alert(this.color);
};
var oCar1 = new Object;
oCar1.color = "red";
oCar1.showColor = showColor;
var oCar2 = new Object;
oCar2.color = "blue";
oCar2.showColor = showColor;
oCar1.showColor();		//输出 "red"
oCar2.showColor();		//输出 "blue"

TIY

在上面的代码中,首先用 this 定义函数 showColor(),然后创建两个对象(oCar1 和 oCar2),一个对象的 color 属性被设置为 "red",另一个对象的 color 属性被设置为 "blue"。两个对象都被赋予了属性 showColor,指向原始的 showColor () 函数(注意这里不存在命名问题,因为一个是全局函数,而另一个是对象的属性)。调用每个对象的 showColor(),oCar1 输出是 "red",而 oCar2 的输出是 "blue"。这是因为调用 oCar1.showColor() 时,函数中的 this 关键字等于 oCar1。调用 oCar2.showColor() 时,函数中的 this 关键字等于 oCar2。

ကြေညာပါ။ အရာဝတ္တု၏ အခြေအနေ ကို ကိုယ်စားပြုရန် အားလုံး သင့်လျှင် this စကားရပ် အား အသုံးပြုသင့်သည်။ ဥပမာ။ အောက်ပါ ကြောင်းအား သုံးပြုခြင်း ဖြင့် showColor() ဓာတ်ပြောင်းလုပ်ငန်း မပြောင်းလဲလိမ့်မည်။

function showColor() {
  alert(color);
};

အရာဝတ္တုကို အမျိုးအစား သို့မဟုတ် this စကားရပ် အား အသုံးပြုခြင်း မရှိဘဲ ဖြစ်လျှင် အမော်ဒီယာများ အား နှင့် ပတ်သက်၍ ECMAScript သည် အရာဝတ္တုကို နောက်ဆုံး အရာဝတ္တု သို့မဟုတ် အရာဝတ္တု ကို အသုံးပြုလိမ့်မည်။ ထို့နောက် အမှုန်းသည် အရာဝတ္တုကို မရှာနိုင်၍ သို့မဟုတ် မရှာနိုင်ဘူး။ အခြေအနေအတိုင်း အခြေအနေအချက်အလက်များ အား သတ်မှတ်ခြင်း မရှိ။ ထို့ကြောင့် အမှုန်းသည် "null" ကို အခေါ်ခေါ်လိမ့်မည်။