关于javascript中的静态属性和静态方法

在网上看到了一个javascript教程的例子,有些不好理解

 

ContractedBlock.gif ExpandedBlockStart.gif Code
<SCRIPT LANGUAGE="JavaScript"> 
       
//静态属性:静态属性又称公共属性,它不属于某个类的实例,而是直接属于某个类。 
       function user(name) 
        { 
          
this.Name  =  name ; //实例属性 
        } 
        user.prototype.age 
= 0//静态属性 
  user.prototype.birthday = function(){//静态方法 
        this.age++
     
//这里是this ,而不是 user.prototype.age++; 
  } 
   
  
var XiaoWang = new user("小王");//小王 
  var XiaoLiu = new user("小刘");//小刘 
  alert(XiaoWang.age); // 0 ; 
        alert(XiaoLiu.age);  // 0 ; 
        XiaoWang.birthday();//小王过生日了。此时小王已经 拥有了一个 自己的 age 属性, 不需要再去原型中寻找。 ?????这个地方实在看不懂?能否解释下? 
  XiaoWang.age++//  跟 birthday() 方法 同理。?????这个地方实在看不懂?能否解释下?为什么XiaoWang.age++,就有了自己的age属性了 
        user.prototype.birthday(); 
        alert(XiaoWang.age); 
// 2 ; 
        alert(XiaoLiu.age);  // 1 ; 
  /* 
          首先我们解释 XiaoWang.age  为什么是2?而不是3? 
    在前面的过程中,XiaoWang.birthday(); 在这一步后, 
    其实小王已经拥有了属性age,也就是说已经为小王创建了一个跟静态属性同名的 实例属性。 
          所以当 user.prototype.birthday()这之后,  XiaoWang.age并不会 +1 ,不管原型如何变化,都跟他无关了。 
          
          而为什么XiaoLiu.age是 1 呢 ? 
          因为小刘没有自己的实例属性age,所以他会到原型中寻找 名称为age的静态属性。 
    静态属性通过user.prototype.birthday()进行了 +1 , 所以XiaoLiu.age是 1 . 
  
*/ 
</SCRIPT>

 

经过一番思考我认为这个问题的关键如下。
user.prototype.birthday = function(){//静态方法
        this.age++; }
//这是整个问题的核心,先回归javascript最基本的概念,就是如何定义一个对象的属性,直接obj.属性名=属性值。就为obj新增了一个属性。this.age++可以理解为this.age=this.age+1;当执行this.age+1时,会从它的原型属性中找到this.age=1,而当这个值赋给this.age的时候,就向前面所说的如何定义一个对象的属性。这时this有了自己的属性age,而不再从原型中查找。不知我理解的对不对,请各们大侠拍砖。。。

其它理解:

 

改成Js代码
user.prototype.birthday = function(){  
                if(!this.age){  
                    this.age = 0;  
                }  
                this.age += 1;  
            }  

user.prototype.birthday = function(){
    if(!this.age){
     this.age = 0;
    }
    this.age += 1;
   }

然后
Js代码
alert(XiaoWang.hasOwnProperty("age"));  
            XiaoWang.birthday();  
            alert(XiaoWang.hasOwnProperty("age")); 

alert(XiaoWang.hasOwnProperty("age"));
   XiaoWang.birthday();
   alert(XiaoWang.hasOwnProperty("age"));

再看不明白的话,就先去看看基础的吧,可能是this.age++;这个有点魔幻,去查查ecma-262,估计就是我写的那个意思

 

转载于:https://www.cnblogs.com/ForFreeDom/archive/2009/11/14/1603177.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值