原文:javascript中类的属性研究

  本篇文章主要针对javascript的属性进行分析,由于javascript是一种基于对象的语言,本身没有类的概念,所以对于javascript的类的定义有很多名字,例于原型对象,构造函数等,它们都是指javascript中的类。
   例如:function Person(){} var p = new Person(); 这里的Person可以看作一个类,而p则是这个类的实例也可以称为对象。这里主要分析js里面的四种属性。  
  私有属性,指定义在类中用var声明的,即var propertyName = sonmeValue,只能在这个类里面进行访问,不能被继承,也不能在原型方法中访问的属性。
  特权属性,指在类中或者说在构造函数中(js里是同一个东西),使用this关键字,即this.propertyName = someValue,该属性在类中可以访问,在原型方法中可以访问,在该类的对象中也能被访问,甚至用call或apply继承时也能访问.
  共有属性,指通过ClassName.prototype.propertyName=someValue 来定义的,如果该属性在类中没定义,即没有重命的特权属性,则可以当特权属性被访问,即能在对象中调用,通过prototype继承的子类也能访问。
  静态属性,直接ClassName.propertyName=someValue 来定义,相当于一个命名空间,在类的内部外部都能访问。

  例1: 各种属性定义 

  1. function Person(){
  2. var private_name = "小明"; //私有属性
  3. var private_age = 10; //私有属性
  4. this.privilege_name = "小红"; //特权属性
  5. this.privilege_age = 9; //特权属性
  6. }
  7. Person.prototype.public_name = "小芳"; //公有属性
  8. Person.prototype.public_age =8; //共有属性
  9. Person.static_name = "小李"; //静态属性
  10. Person.static_age = 7; //静态属性
  11.  
  12. var pp = new Person();
  13. pp.name = '小王'; //静态属性
  14. pp.age = 6; //静态属性

 在这个例子里指出了这四种属性的定义方式。注意静态属性里,因为Person和pp都是Object实例,如下面代码执行结果可以看出。

 console.log(Person instanceof Object,pp instanceof Object); //true true

 所以都可以定义静态属性。

 下面来分析一下这些属性的访问权限。
 例2:各种属性的访问权限 

  1. function Person(){
  2. var private_name = '小明';
  3. var private_age = 10;
  4.   this.privilege_name = '小红';
  5.   this.privilege_age = 9;
  6.  
  7. //定义一个特权方法
  8.   this.showPrivilegeName = function(){
  9.     console.log(private_name); // private_name is not defined .说明私有属性可以在特权方法中访问.
  10.     console.log(this.privilege_name ); //输出:"小红"。说明特权属性可以在特权方法中访问
  11.     console.log(this.public_name); //输出:"小芳"。说明共有属性可以在特权方法中访问
  12.     console.log(Person.static_name); //输出:"小李"。说明类的静态属性可以在特权方法中访问
  13.   }
  14. }
  15.  
  16. Person.prototype.public_name = '小芳';
  17. Person.prototype.public_age =8;
  18. Person.static_name = '小李';
  19. Person.static_age = 7;
  20. var pp = new Person();
  21. pp.name = '小王';
  22. pp.age = 6;
  23.  
  24. //定义一个原型方法
  25. Person.prototype.showName = function(){
  26.   //console.log(private_name); // private_name is not defined .说明私有属性不能在原型方法中访问.
  27.   console.log(this.privilege_name ); //输出:"小红"。说明特权属性可以在原型方法中访问
  28.   console.log(this.public_name); //输出:"小芳"。说明共有属性可以在原型方法中访问
  29.   console.log(Person.static_name); //输出:"小李"。说明类的静态属性可以在原型方法中访问
  30. }
  31.  
  32. pp.showPrivilegeName();
  33. pp.showName();
  34. console.log(pp.private_name); //undefined 私有属性不能在实例化的对象中访问
  35. console.log(pp.privilege_name ); //输出:"小红"。说明特权属性可以在原型方法中访问
  36. console.log(pp.public_name); //输出:"小芳"。说明共有属性可以在原型方法中访问
  37. console.log(Person.static_name); //输出:"小李"。说明类的静态属性可以在原型方法中访问
  38. console.log(pp.name); //输出:"小王"。说明实例对象的静态属性可以在原型方法中访问

  可以看到如果特权属性和公共属性重名的话,访问特权属性,如果特权属性不存在的话则访问共有属性。另外如果用delete对象的属性删掉是删的特权属性,删除后可以继续访问共有属性。对于对象的静态属性只能该对象能访问,类的其它对象是不能访问的。

  例3:特权属性和对象静态属性之间的优先级问题   

  1. function Person(){
  2.   this.name = '小李';
  3. }
  4. var p1 = new Person();
  5. p1.name = '小红';
  6. p1.age = 10
  7. console.log(p1.name); //小红
  8. console.log(p1.age); //10
  9. delete p1.name
  10. console.log(p1.name); //undefined

  例4特权属性和对象静态属性之间的优先级问题

  1. function Person(){
  2. this.name = '小李';
  3. }
  4. var p1 = new Person();
  5. p1.name = '小红';
  6. p1.age = 10
  7. console.log(p1.name); //小红
  8. console.log(p1.age); //10
  9. delete p1.name
  10. console.log(p1.name); //undefined

  可以看到如果创建了对象后,给该对象创建一个与特权属性同名的静态属性,特权属性的值会被覆盖,如果用delete删除后,再访问为undefined。

  1.  总结:对象的静态属性只能该对象本身能访问,优先级:对象的静态属性>类的特权属性>共有属性。其中对象的静态属性会覆盖类的特权属性,而类的特权属性并不会覆盖共有属性,即用delete删除该对象的属性是删除它的特权属性,并不能删除类的共有属性。 
     对于类静态属性和方法,是到处都能访问的,即相当于命名空间。
     对于类的共有属性,特权属性在外部是可以访问的。
     对于私有属性和方法,只有类的内部能使用。其中类的共有属性和方法可以访问类的特权属性和方法,但不能访问类的私有属性和方法。

javascript中类的属性研究的更多相关文章

  1. javascript中类的属性访问权限研究(1)

    本篇文章主要针对javascript的属性进行分析,由于javascript是一种基于对象的语言,本身没有类的概念,所以对于javascript的类的定义有很多名字,例于原型对象,构造函数等,它们都是 ...

  2. 采用异步来实现重新连接服务器或者重新启动服务 C#中类的属性的获取 SignalR2简易数据看板演示 C#动态调用泛型类、泛型方法 asp .net core Get raw request. 从壹开始前后端分离[.NetCore 不定期更新] 38 ║自动初始化数据库

    采用异步来实现重新连接服务器或者重新启动服务 开启异步监听,不会导致主线程的堵塞,在服务异常断开后一直检测重新连接服务,成功连接服务后通知各个注册的客户端! #region 检测断线并重连OPC服务 ...

  3. JScript中的prototype(原型)属性研究

    今天看到同事使用js中的Prototype,感觉很是新鲜.由此想深入学习一下prototype(英['prəʊtətaɪp] 美['protə'taɪp]n. 原型:标准,模范),在学习prototy ...

  4. Javascript中类的实现机制(四)

    一:  理解类的实现机制 在JavaScript中可以使用function关键字来定义一个“类”,如何为类添加成员.在函数内通过this指针引用的变量或者方法都会成为类的成员,例如:function ...

  5. JavaScript 数组 length 属性获取数组长度或设置数组元素的数目

    JavaScript 数组 length 属性 JavaScript 数组 length 属性可返回或设置或组中元素的数目,语法如下: array_object.length 利用 length 属性 ...

  6. 深入理解JavaScript中的属性和特性

    深入理解JavaScript中的属性和特性 JavaScript中属性和特性是完全不同的两个概念,这里我将根据自己所学,来深入理解JavaScript中的属性和特性. 主要内容如下: 理解JavaSc ...

  7. Javascript中length属性的总结

    Javascript中length属性的总结 一.StringObject中的length     length属性是返回字符串的字符数目. 例如: // 普通字符串 var str = " ...

  8. CSS和JavaScript标签style属性对照表

    CSS和JavaScript标签style属性对照表一般情况是把"-"去掉,后面字母用大写. CSS语法 (不区分大小写) JavaScript语法 (区分大小写) border ...

  9. JavaScript检测实例属性, 原型属性

    0.前提 JavaScript对象的属性分为两种存在形态. 一种是存在实例中, 另一是存在原型对象中. 根据上述, 检测属性的时候会出现4种情况 既不存在实例中, 也不存在原型对象中 存在实例中, 不 ...

随机推荐

  1. hdu4190 简单的二分法

    题意是 有n个城市,m个投票箱.接下来n个城市人口数,每一个投票箱都不能为空.计算最后投票箱的容量必须达到多少,才干满足须要. 每一个城市的人必须仅仅能将票投到自己城市分得得投票箱中.要是容量最小箱子 ...

  2. 基于高性能的硬件配置Nginx

    Nginx高级配置将涉及硬件,假设你配置不好,直接使各种性能下降. 我这里总结一下.怎样依据server的硬件设备来配置Nginx. 见下图: 低訪问量的网络,能够这样配置. 标准的网络訪问量,能够这 ...

  3. Caused by: org.springframework.beans.factory.BeanCreationException

    1.错误原因 2014-7-13 17:36:57 org.apache.jasper.compiler.TldLocationsCache tldScanJar 信息: At least one J ...

  4. FastReport的再次使用

    FastReport.Net是一款功能齐全的报表分析解决方案. 前两年工作的时候就是使用FastReport进行报表设计,只是当时使用的时候都是调用别人写好的帮助类,直接调用即可.当时让人觉得不明觉厉 ...

  5. 排序算法c语言描述---选择排序

    排序算法系列学习,主要描述冒泡排序,选择排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序等排序进行分析. 文章规划: 一.通过自己对排序算法本身的理解,对每个方法写个小测试程序. 具体思路分析 ...

  6. 遗传算法解决旅行商问题(TSP)

    这次的文章是以一份报告的形式贴上来,代码只是简单实现,难免有漏洞,比如循环输入的控制条件,说是要求输入1,只要输入非0就行.希望会帮到以后的同学(*^-^*) 一.问题描述 旅行商问题(Traveli ...

  7. Docker系列之(一):10分钟玩转Docker(转)

    1.前言 进入云计算的时代,各大云提供商AWS,阿里云纷纷推出针对Docker的服务,现在Docker是十分火爆,那么Docker到底是什麽,让我们来体验一下. 2.Docker是什麽 Docker是 ...

  8. 页面中插入百度地图(使用百度地图API)

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWF5dW4wNTE2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  9. Entity Framework笔记(二)

    前几日学习了在VS2010Console项目中使用Entity Framework,并且使用Code First模式.通过编写Model类,来生成数据库对应的表.并且,往表中写入数据以及获取表中的所有 ...

  10. Python网络01 原始Python服务器

    原文:Python网络01 原始Python服务器 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 之前我的Python教程中有人 ...