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

时间:2022-09-25 11:11:04

本篇文章主要针对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删除该对象的属性是删除它的特权属性,并不能删除类的共有属性。 
 对于类静态属性和方法,是到处都能访问的,即相当于命名空间。
 对于类的共有属性,特权属性在外部是可以访问的。
 对于私有属性和方法,只有类的内部能使用。其中类的共有属性和方法可以访问类的特权属性和方法,但不能访问类的私有属性和方法。

javascript中类的属性访问权限研究(1)的更多相关文章

  1. javascript中类的属性研究

    原文:javascript中类的属性研究 本篇文章主要针对javascript的属性进行分析,由于javascript是一种基于对象的语言,本身没有类的概念,所以对于javascript的类的定义有很 ...

  2. Delphi XE中类成员的访问权限(新增了strict private和strict protected,还有automated)

    Delphi XE中类成员的访问权限共提供了6个关键词来用于限定访问权限:public.private.protected.published.automated strict private . s ...

  3. .NET 控制Windows文件和目录访问权限研究(FileSystemAccessRule)

    前一段时间学习了.net 控制windows文件和目录权限的相关内容,期间做了一些总结.想把这方面的研究跟大家分享,一起学习.其中不免得有些用词不太标准的地方,希望大家留言指正,我加以修改. 首先,我 ...

  4. javascript 如何避免属性访问错误

    var book = {subtitle: "Bible"}; var bookName = book.name.length // 这时候会出错,  因为试图查询这个不存在的对象 ...

  5. 《Think in Java》(六)访问权限控制

    类访问权限:public,default(包访问权限的类,在包外可以调用该类的static成员) 类属性访问权限:public,protected,default,private

  6. 【Java_基础】Java的访问权限控制

    1.类成员的访问权限控制 Java中类成员的访问权限分为四类:private,无(默认情况下),protected和public.其权限控制如下表所示: 修饰词 本类 同一个包的类 继承类 其他类 p ...

  7. SQL SERVER 属性OWNER不可用于数据库xxx。该对象可能没有此属性,也可能是访问权限不足而无法检索。

    今天遇到一个案例:右键单击数据库的属性时出现下面错误提示: 属性Owner不可用于数据库xxx,该对象可能没有此属性,也可能是访问权限不足而无法检索. 使用脚本查看该数据库的Owner时发现Owner ...

  8. JavaScript对象属性访问的两种方式

    JavaScript对象属性访问的两种方式 object.attribute object["attribute"] 例如: var employees = [ { "f ...

  9. Solidity属性和方法的访问权限

    属性:默认是internal的类型,外部是不可以访问调用的,如果加上public的话,那么是会自动为这个属性加上一个get的方法的,比如uint   public _age; => functi ...

随机推荐

  1. PHP环境的搭建(Apache)

    一,下载XAMPP集成软件包. 二,Apache的安装配置: Apache的安装就点击下一步下一步,默认路径在系统的C盘. 三,在star   Apache的时候,出现了端口号80冲突(被占用),解决 ...

  2. 用python简单处理图片(3):添加水印

    python版本:3.4 Pillow版本:3.0 一.添加文字水印 from PIL import Image, ImageDraw,ImageFont im = Image.open(" ...

  3. loj 1021(状压dp+记忆化搜索)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25887 题目大意:给定的一个某进制下的排列,问它的全排列有多少个能 ...

  4. 利用jdbc连接oracle数据库

    JDBC是Sun公司制定的一个可以用Java语言连接数据库的技术. 一.JDBC基础知识 JDBC(Java Data Base Connectivity,java 数据库连接)是一种用于执行SQL语 ...

  5. ajax请求响应中用window.open打开新窗口会被浏览器拦截的解决方式

    一.问题描述 ajax 异步请求成功后需要新开窗口打开 url,使用的是 window.open() 方法,但是会被浏览器给拦截了,需要用户点下. 二.问题分析 浏览器之所以拦截新开窗口是因为该操作并 ...

  6. Java基础13:反射详解

    本节主要介绍Java反射的原理,使用方法以及相关的技术细节,并且介绍了关于Class类,注解等内容. 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech ...

  7. 论文阅读(Weilin Huang——【ECCV2016】Detecting Text in Natural Image with Connectionist Text Proposal Network)

    Weilin Huang——[ECCV2016]Detecting Text in Natural Image with Connectionist Text Proposal Network 目录 ...

  8. 【POJ2226】Muddy Fields

    题目大意:给定一个 N*M 的图,图中有一些格子不能被任何东西覆盖,现有一些宽度为 1,长度任意的骨牌覆盖这些可以被覆盖的格子,骨牌之间可以重叠,求将所有可以被覆盖的格子覆盖所需的最小骨牌数是多少. ...

  9. LeetCode 232:Implement Queue using Stacks

     Implement the following operations of a queue using stacks. push(x) -- Push element x to the back ...

  10. pandas学习(常用数学统计方法总结、读取或保存数据、缺省值和异常值处理)

    pandas学习(常用数学统计方法总结.读取或保存数据.缺省值和异常值处理) 目录 常用数学统计方法总结 读取或保存数据 缺省值和异常值处理 常用数学统计方法总结 count 计算非NA值的数量 de ...