代码改变世界

JavaScript之要点温习

2011-02-15 23:15  YZGJTSJT  阅读(221)  评论(0编辑  收藏  举报

闲暇之余重温JavaScript把要点加以摘录

1、关键字 this

概念:在JavaScript中,任何用作方法的函数都被有效地传递了一个隐式的参数,即调用函数的对象。

例证:this的常见用法  

    function dog() {
        
this.Name;
        
this.Color;
        
this.setDog = function (name, color) {
            
this.Name = name;
            
this.Color = color;
        };
    };

很明显setDog的作用是用来给Name和Color赋值(虽然不妥,在这里只为证明),调用结果没有任何问题。

    (function () {
        
var dog1 = new dog();
        dog1.setDog(
"Katty""Yellow");
        alert(dog1.Name 
+ dog1.Color);
    })();

结果

很明显setDog方法中的this在执行过程中所指向的引用对象就是dog1,如何证明这一点呢。可以绕开this用一个辅助方法做到这点。

    function dog() {
        
this.Name;
        
this.Color;
    };

    
function setAnimal(animal, name, color) {
        
if (animal instanceof dog) {
            animal.Name 
= name;
            animal.Color 
= color;
        } 
else {
            
throw new Error("isn't dog!");
        };
    };

    (
function () {
        
var dog1 = new dog();
        setAnimal(dog1, 
"Ketty""Yellow");
        alert(dog1.Name 
+ dog1.Color);
    })();
结果

结果同上面是一样的,这样理解this或许更清晰一些 。


2、属性继承

概念:属性继承只发生在读取时

例证:

    function Circle(x,y,z) {
        
this.X = x;
        
this.Y = y;
        
this.Z = z;
    };

    Circle.prototype.PI 
= 3.1415926;

    (
function () {
        
var c = new Circle(1,2,3);
        alert(c.
PI
);
        c1.PI 
= 100;
        alert(c.PI);
        alert(Circle.prototype.PI);
    })();

在获取c.PI时,JavaScript会首先检查c是否有一个名为PI的属性。如果没有,它接下来会检查c的原型对象是否有一个名为PI的属性。很显然 Circle.prototype中的确存在名为PI的属性,那么它就会返回原型对象中PI的值。

当写入c.PI时(即c.PI = 100),会发生什么呢? 

首先还是检查c是否有一个名为PI的属性。如果没有,它则会把PI作为c自身的一个新属性创建,这也就意味着不会再去检查c的原型对象是否会有PI属性。此时再访问c.PI与访问c.X、c.Y、c.Z一样,都作为c的自身属性读取或写入。

因此在例证中,第一次弹出(获取)c.PI时,所取得的值为c的原型中的PI属性值。在经过给c.PI赋值后,c中便有了一个自身的PI属性。因此再次获取c.PI时,得到的结果必然是赋给的100。而原型对象的值仍然为3.1415926。


3、私有成员

概念:把属性变为私有的

例证:

    function Square(w, h) {
        
this.width = w;
        
this.height = h;
    };
    Square.prototype.area 
= function () {
        
return this.width * this.height;
    };

很显然,宽和高是能够被访问到的,如何改变呢!

    function Square(w, h) {
        
this.width = function () { return w; };
        
this.height = function () { return h; };
    };
    Square.prototype.area 
= function () {
        
return this.width() * this.height();
    };

这样就巧妙地实现了一个不可变的Square对象,其宽度和高度不能被改变,而且只能通过accessor方法来访问。

:一般认为 Douglas Crockford 是第一个发现(或者说至少是发表)这种定义私有属性的方法的人。他的最初的讨论可在Http://www.crockford.com/javascript/private.html获得。