`
hhr_michael
  • 浏览: 74307 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类
最新评论

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"。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics