Scope object ECMAScript
- Baya na tsaki Kwarin kwallon
- Baya na baya Tunawa kwarin ko kwallon
作用域指的是变量的适用范围。
公用、私有和受保护作用域
概念
在传统的面向对象程序设计中,主要关注于公用和私有作用域。公用作用域中的对象属性可以从对象外部访问,即开发者创建对象的实例后,就可使用它的公用属性。而私有作用域中的属性只能在对象内部访问,即对于外部世界来说,这些属性并不存在。这意味着如果类定义了私有属性和方法,则它的子类也不能访问这些属性和方法。
受保护作用域也是用于定义私有的属性和方法,只是这些属性和方法还能被其子类访问。
ECMAScript 只有公用作用域
对 ECMAScript 讨论上面这些作用域几乎毫无意义,因为 ECMAScript 中只存在一种作用域 - 公用作用域。ECMAScript 中的所有对象的所有属性和方法都是公用的。因此,定义自己的类和对象时,必须格外小心。记住,所有属性和方法默认都是公用的!
建议性的解决方法
许多开发者都在网上提出了有效的属性作用域模式,解决了 ECMAScript 的这种问题。
Wannan sabonin da ba kaiya da ba kaiya ce, anfasiya ce kaiya ce kanamici. Anfasiya ce kaiya ce kanamici, kofin kaiya ce kaiya ce kanamici:
obj._color_ = "blue";
Anfasiya da code, attariki color ce kanamici. Tashi, kofin ba kaiya ba kaiya ce fa'ani attariki ce yanci, wani kaiya ka koyi wa'ana ba wani attariki ce kanamici.
有些开发者还喜欢用单下划线说明私有成员,例如:obj._color。
静态作用域
静态作用域定义的属性和方法任何时候都能从同一位置访问。在 Java 中,类可具有属性和方法,无需实例化该类的对象,即可访问这些属性和方法,例如 java.net.URLEncoder 类,它的函数 encode() 就是静态方法。
ECMAScript 没有静态作用域
严格来说,ECMAScript 并没有静态作用域。不过,它可以给构造函数提供属性和方法。还记得吗,构造函数只是函数。函数是对象,对象可以有属性和方法。例如:
function sayHello() { alert("hello"); } sayHello.alternate = function() { alert("hi"); } sayHello(); //输出 "hello" sayHello.alternate(); //输出 "hi"
这里,方法 alternate() 实际上是函数 sayHello 的方法。可以像调用常规函数一样调用 sayHello() 输出 "hello",也可以调用 sayHello.alternate() 输出 "hi"。即使如此,alternate() 也是 sayHello() 公用作用域中的方法,而不是静态方法。
关键字 this
this 的功能
在 ECMAScript 中,要掌握的最重要的概念之一是关键字 this 的用法,它用在对象的方法中。关键字 this 总是指向调用该方法的对象,例如:
var oCar = new Object; oCar.color = "red"; oCar.showColor = function() { alert(this.color); }; oCar.showColor(); //输出 "red"
在上面的代码中,关键字 this 用在对象的 showColor() 方法中。在此环境中,this 等于 oCar。下面的代码与上面的代码的功能相同:
var oCar = new Object; oCar.color = "red"; oCar.showColor = function() { alert(oCar.color); }; oCar.showColor(); //输出 "red"
使用 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(); //zai nuna "red" oCar2.showColor(); //zai nuna "blue"
A cikin codes da ake kira, a baya suna yi amfani da this domin tunawa da methoden showColor(), kuma suna tsara biyu kwallon (oCar1 da oCar2), wanda kwallon color na wanda ya zama "red", kuma kwallon color na wanda ya zama "blue". Biyu kwallon suna da matsalolin showColor, suka neman sabon showColor () (rarraba, wanda na kasa da na kwallon yana da matsala, kuma wanda na kwallon yana da matsalolin kwallon). Duba kwallon kowane showColor(), oCar1 zai samu "red", kuma oCar2 zai samu "blue". Hanyar da ake amfani da oCar1.showColor() ce, kalaman this a cikin kwarin zai kai wa oCar1. Idan ake amfani da oCar2.showColor(), kalaman this a cikin kwarin zai kai wa oCar2.
Rarraba, domin yin neman matsalolin kwallon, a kai amfani da kalaman this. Misali, idan a yi amfani da codes daga baya, methoden showColor() ba za a iya duba su ba:
function showColor() { alert(color); };
Idan ba a amfani da kwallon ko kalaman this domin yin neman wanda, ECMAScript zai gana shi azaman kwallon lausa ko kwallon gida. Duk da haka, a lokacin da ake nemi kwallon "color", ba a samu shi ba. Kuma kuma? A lokacin da ake neman kwallon, ake nuna "null" a kwanan wata.
- Baya na tsaki Kwarin kwallon
- Baya na baya Tunawa kwarin ko kwallon