JavaScript高级程序设计 (读书笔记6)

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

公用作用域中的对象属性可以从对象外部访问,即开发者创建对象的实例后,就可使用它的公用属性。


私有作用域中的属性只能在对象内部访问,即对于外部世界来说,这些属性并不存在。
这也意味着如果类定义了私有属性和方法,则它的子类也不能访问这些属性和方法。


受保护作用域
虽然在不同语言中,受保护作用域的应用的规则不同,但一般说来,它都用于定义私有的属性和方法,
只是这些属性和方法还能被其子类访问。


对ECMAScript讨论这些作用域几乎毫无意义,
因为ECMAScript中只存在一种作用域——公用作用域。

ECMAScript中的所有对象的所有属性和方法都是公用的。
因此,定义自己的类和对象时,必须格外小心。

记住,所有属性和方法默认都是公用的。


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

由于缺少私有作用域,开发者们制定了一个规约,说明哪些属性和方法应该被看作私有的。

这种规约规定在属性名前后加下划线。例如:

obj._color_ = "red";
这段代码中,属性color是私有的。

记住,这些下划线并不改变这些属性是公用属性的事实,它只是告诉其他开发者,应该把该属性看作私有的。


2 静态作用域并非静态的

静态作用域定义的属性和方法任何时候都能从同一个位置访问。

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

sayHi.alternate = function() {
alert("hola");
};

sayHi(); //outputs "hi"
sayHi.alternate(); //outputs "hola"


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


3 关键字this

在ECMAScript中,要掌握的最重要的概念之一是关键字this的用法,它用在对象的方法中。
关键字this总是指向调用该方法的对象,例如:

var oCar = new Object;
oCar.color = "red";
oCar.showColor = function(){
alert(this.color);//outputs red
};
oCar.showColor();

这里,关键字this用在对象的showColor()方法中。在此环境中,this等于oCar

那么为什么使用this呢?因为在实例化对象时,总是不能确定开发者会使用什么样的变量名。
使用this,即可在任意多个地方重用同一个函数。


注意,引用对象的属性时,必须使用this关键字。


如果不用对象或this关键字引用变量,ECMAScript就会把它看作局部变量或全局变量。
然后该函数将查找名为color的局部或全局变量,但是不会找到的。

结果如何?该函数将在警告中显示"null"。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值