zoukankan      html  css  js  c++  java
  • js-静态、原型、实例属性

    本篇来说一下js中的属性:

    1、静态属性

    2、原型属性

    3、实例属性

    静态属性:


     
    1. function klass(){}  
    2. var obj=new klass();  
    3. klass.count=0;  
    4. klass.count++;  
    5. console.log(obj.count);//undefined  
    6. console.log(klass.count);//1  

    静态属性存在于对象中。它的访问方式只有:类名.count 一种方式,无法通过实例访问。

    如:Math.PI

    原型属性:

    在讲解原型属性之前有必要先提一下new操作符:
         ①:var obj=klass()和②:var obj=new klass()的结果显然是不同的。
         ①的操作仅仅是简单的调用klass函数,然后把klass函数的返回值赋给obj变量。
         ②所做的操作是:调用构造函数klass,创建一个包含prototype内部指针的新对象obj。

         直观看来:使用new操作符是创建该类的实例对象,而不使用new操作符则是直接调用函数。

    好了,下面继续看原型属性:

    原型属性又称公共属性,它不属于某个类的实例,而是直接属于某个类。

    [javascript] view plain copy
     
    1. function klass(){}  
    2. var obj=new klass();  
    3. klass.prototype.count=0;  
    4. klass.prototype.count++;  
    5. console.log(klass.prototype.count);//1  
    6. console.log(obj.count);//1  

    原型属性存在类的原型之中。它的访问方式有两种:

    1、类名.prototype.count

    2、实例对象.count

    第二种访问方式的原理是:

    首先在实例对象中查找,如果找到则立即返回,否则在原型(原型链)中查找(因为new操作符创建的对象包含了一个prototype的内部指针,所以可以向上追溯,查找属性),找到则返回相应的值,否则返回undefined。

    所以obj.count的方式实际操作的是klass.prototype.count属性。

    再看下面的例子:

     
    1. function klass(){}  
    2. var obj=new klass();  
    3. klass.prototype.count=0;  
    4. klass.prototype.count++;  
    5. obj.count++;  
    6. console.log(klass.prototype.count);//1  
    7. console.log(obj.count);//2  
     

    与上面不同的是仅仅加了一句obj.count++;按照属性查找的原理,obj中并不存在count属性,所以他会在原型链中查找count属性,返回klass.prototype.count。

    obj.count++即可拆分为更加直观的:obj.count=klass.prototype.count+1;可以看出这一句话是简单的赋值也是属性定义:

    首先给obj定义了一个实例属性count,再将klass.prototype.count+1的结果赋值给obj.count。

    所以klass.prototype.count的结果为1,obj.count的结果是2。

    以上便是要讲解的第三者属性:实例属性。

    实例属性是公开的(public),可以通过类的实例(或this.)直接访问和修改它。也就是归属实例所有。

    明白了相应的概念,我们再来讲一下他们各自的使用场合,看下面的例子:


     
    1. function klass(id){  
    2.   this.id=id;  
    3. }  
    4.   
    5. klass.Uid=1;  
    6.   
    7. klass.prototype.names=[];  
    8.   
    9. var obj1=new klass("obj1");  
    10. var obj2=new klass("obj2");  
    11. obj1.names.push(obj1.id);  
    12. klass.Uid++;  
    13. obj1.names.push(obj2.id);  
    14. klass.Uid++;  

     
    1. console.log(obj1.id);//obj1  
    2. console.log(obj2.id);//obj2  
    3. console.log(klass.prototype.names);//obj1 , obj2  
    4. console.log(klass.Uid);//3  
    
    
    
    
    
    
    
    
    
    

    他们的应用场合显而易见,静态属性是全局的,原型属性是实例公有的,实例属性是各个实例所独有的。

    js的属性篇基本就到此结束,有疑问或错误之处欢迎指出,请大家多多赐教。

  • 相关阅读:
    实现高效易用的java操作mysql包装
    部分NLuke版本源码更新(2009111)
    ASP.NET Forms验证的安全性问题研究——为什么加密代码需要配置为服务
    VirtualBox 虚拟机 Debian系统上安装Cassandra步骤及遇到的问题
    mysql master/slave 使用感受
    一个不必要的设计
    应对服务器端访问限制的一些办法(Cookie,Session,IP等)
    qq四国军旗2.1 beat03 builde017记牌器开发思路(一)
    MVC与WebForm最大的区别
    dell笔记本的Broadcom 802.11b/g 无线网卡ubuntu 9.10下安装
  • 原文地址:https://www.cnblogs.com/wangqingyun/p/6259999.html
Copyright © 2011-2022 走看看