javascript中类的属性研究

简介: 原文:javascript中类的属性研究  本篇文章主要针对javascript的属性进行分析,由于javascript是一种基于对象的语言,本身没有类的概念,所以对于javascript的类的定义有很多名字,例于原型对象,构造函数等,它们都是指javascript中的类。
原文: 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: 各种属性定义 

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

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

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

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

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

 

function Person(){
    var private_name = '小明';
    var private_age = 10;    
  this.privilege_name = '小红'; 
  this.privilege_age = 9; 
 
    //定义一个特权方法
  this.showPrivilegeName = function(){
    console.log(private_name);             // private_name is not defined .说明私有属性可以在特权方法中访问.
    console.log(this.privilege_name );         //输出:"小红"。说明特权属性可以在特权方法中访问
    console.log(this.public_name);            //输出:"小芳"。说明共有属性可以在特权方法中访问
    console.log(Person.static_name);        //输出:"小李"。说明类的静态属性可以在特权方法中访问
  }
}
 
Person.prototype.public_name = '小芳';
Person.prototype.public_age =8;   
Person.static_name = '小李';   
Person.static_age = 7;    
var pp = new Person();
pp.name = '小王';       
pp.age = 6;
 
//定义一个原型方法
Person.prototype.showName = function(){
  //console.log(private_name);         // private_name is not defined .说明私有属性不能在原型方法中访问.
  console.log(this.privilege_name );         //输出:"小红"。说明特权属性可以在原型方法中访问
  console.log(this.public_name);        //输出:"小芳"。说明共有属性可以在原型方法中访问
  console.log(Person.static_name);        //输出:"小李"。说明类的静态属性可以在原型方法中访问
}   
 
pp.showPrivilegeName();
pp.showName();
console.log(pp.private_name);            //undefined 私有属性不能在实例化的对象中访问 
console.log(pp.privilege_name );         //输出:"小红"。说明特权属性可以在原型方法中访问
console.log(pp.public_name);            //输出:"小芳"。说明共有属性可以在原型方法中访问
console.log(Person.static_name);        //输出:"小李"。说明类的静态属性可以在原型方法中访问
console.log(pp.name);                 //输出:"小王"。说明实例对象的静态属性可以在原型方法中访问

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

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

function Person(){
  this.name = '小李';
}
var p1 = new Person();
p1.name = '小红';
p1.age = 10
console.log(p1.name); //小红
console.log(p1.age); //10
delete p1.name
console.log(p1.name); //undefined

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

function Person(){
    this.name = '小李';
}
var p1 = new Person();
p1.name = '小红';
p1.age = 10
console.log(p1.name); //小红
console.log(p1.age); //10
delete p1.name
console.log(p1.name); //undefined

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

 总结:对象的静态属性只能该对象本身能访问,优先级:对象的静态属性>类的特权属性>共有属性。其中对象的静态属性会覆盖类的特权属性,而类的特权属性并不会覆盖共有属性,即用delete删除该对象的属性是删除它的特权属性,并不能删除类的共有属性。 
 对于类静态属性和方法,是到处都能访问的,即相当于命名空间。
 对于类的共有属性,特权属性在外部是可以访问的。
 对于私有属性和方法,只有类的内部能使用。其中类的共有属性和方法可以访问类的特权属性和方法,但不能访问类的私有属性和方法。
目录
相关文章
|
2月前
|
存储 监控 JavaScript
基于布隆过滤器的 Node.js 算法在局域网电脑桌面监控设备快速校验中的应用研究
本文探讨了布隆过滤器在局域网电脑桌面监控中的应用,分析其高效空间利用率、快速查询性能及动态扩容优势,并设计了基于MAC地址的校验模型,提供Node.js实现代码,适用于设备准入控制与重复数据过滤场景。
99 0
|
1月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
167 3
|
5月前
|
监控 算法 JavaScript
基于 JavaScript 图算法的局域网网络访问控制模型构建及局域网禁止上网软件的技术实现路径研究
本文探讨局域网网络访问控制软件的技术框架,将其核心功能映射为图论模型,通过节点与边表示终端设备及访问关系。以JavaScript实现DFS算法,模拟访问权限判断,优化动态策略更新与多层级访问控制。结合流量监控数据,提升网络安全响应能力,为企业自主研发提供理论支持,推动智能化演进,助力数字化管理。
141 4
|
5月前
|
监控 算法 JavaScript
公司局域网管理视域下 Node.js 图算法的深度应用研究:拓扑结构建模与流量优化策略探析
本文探讨了图论算法在公司局域网管理中的应用,针对设备互联复杂、流量调度低效及安全监控困难等问题,提出基于图论的解决方案。通过节点与边建模局域网拓扑结构,利用DFS/BFS实现设备快速发现,Dijkstra算法优化流量路径,社区检测算法识别安全风险。结合WorkWin软件实例,展示了算法在设备管理、流量调度与安全监控中的价值,为智能化局域网管理提供了理论与实践指导。
153 3
|
11月前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
252 1
|
7月前
|
存储 算法 JavaScript
基于 Node.js 深度优先搜索算法的上网监管软件研究
在数字化时代,网络环境呈现出高度的复杂性与动态性,上网监管软件在维护网络秩序与安全方面的重要性与日俱增。此类软件依托各类数据结构与算法,实现对网络活动的精准监测与高效管理。本文将深度聚焦于深度优先搜索(DFS)算法,并结合 Node.js 编程语言,深入剖析其在上网监管软件中的应用机制与效能。
113 6
|
9月前
|
JavaScript 前端开发 容器
this、self、window、top 在 JavaScript 中的区别深入研究
在 JavaScript 开发中,`this`、`self`、`window` 和 `top` 是四个常用的概念。`this` 指向当前执行上下文的对象,其值取决于函数调用方式;`self` 在全局作用域中等同于 `window`,常用于 Web Workers;`window` 代表浏览器窗口,是全局变量的容器;`top` 指向最顶层窗口,用于判断是否在框架中。理解这些概念有助于编写健壮的代码。
276 1
this、self、window、top 在 JavaScript 中的区别深入研究
|
11月前
|
监控 JavaScript 前端开发
确定使用 `defer` 属性还是 `async` 属性来异步加载 JavaScript
【10月更文挑战第24天】选择使用 `defer` 属性还是 `async` 属性来异步加载 JavaScript 是一个需要综合考虑多个因素的决策。需要根据脚本之间的依赖关系、页面加载性能要求、脚本的功能和重要性等因素来进行权衡。在实际应用中,需要通过测试和验证来确定最适合的加载方式,以提供更好的用户体验和页面性能。
203 56
|
Web App开发 JavaScript 前端开发
JavaScript 类(class)
JavaScript 类(class)
107 2
JavaScript 类(class)
|
11月前
|
监控 JavaScript 前端开发
使用 `defer` 属性异步加载 JavaScript
【10月更文挑战第24天】使用 `defer` 属性异步加载 JavaScript 是一种有效的提高页面性能和用户体验的方法。通过合理设置 `defer` 属性,可以在不影响页面渲染的情况下异步加载脚本,并确保脚本的执行顺序。在实际应用中,需要根据具体情况选择合适的加载方式,并注意处理可能出现的问题,以确保页面能够正常加载和执行。

热门文章

最新文章