JavaScript之要点温习

JavaScript进阶
本文深入探讨了JavaScript中的this关键字、属性继承及私有成员等高级特性,并通过实例详细解析了这些特性的使用方法。

闲暇之余重温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获得。

转载于:https://www.cnblogs.com/BubbleTang/archive/2011/02/15/1955644.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值