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); //
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继承(一)—类的属性研究的更多相关文章
- javascript中类的属性研究
原文:javascript中类的属性研究 本篇文章主要针对javascript的属性进行分析,由于javascript是一种基于对象的语言,本身没有类的概念,所以对于javascript的类的定义有很 ...
- JavaScript中的类式继承和原型式继承
最近在看<JavaScript设计模式>这本书,虽然内容比较晦涩,但是细品才发现此书内容的强大.刚看完第四章--继承,来做下笔记. 书中介绍了三种继承方式,类式继承.原型式继承和掺元类继承 ...
- Javascript学习6 - 类、对象、继承
原文:Javascript学习6 - 类.对象.继承 Javasciprt并不像C++一样支持真正的类,也不是用class关键字来定义类.Javascript定义类也是使用function关键字来完成 ...
- JavaScript中的类继承
JavaScript是一个无class的面向对象语言,它使用原型继承而非类继承.这会让那些使用传统面向对象语言如C++和Java的程序员们感到困惑.正如我们所看到的,JavaScript的原型继承比类 ...
- python3 类的属性、方法、封装、继承及小实例
Python 类 Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法. 对象可以包含任意数量和类型的数据. p ...
- 深入理解JavaScript中的类继承
由于写本文时全部是在编辑器中边写代码边写感想的,所以,全部思想都写在代码注释里面了 // 类继承 //todo.1 extends 关键字 class Animal { constructor(nam ...
- [Effective JavaScript 笔记]第40条:避免继承标准类
ECMAScript标准库里配备了许多重要的类,如Array,function,以及Date等.扩展这些类生成子类可以方便完成很多工作,但它们的定义具有很多特殊的行为,所以很难写出行为正确的类. Ar ...
- php函数、类和对象以及类的封装、继承、类的静态方法、静态属性
1.函数 php内置函数可以直接使用,如果没有安装php扩展即可 自定义函数 //函数function 函数名 function dump($var = null){ //支出默认参数 ...
- Python笔记(七):字典、类、属性、对象实例、继承
(一) 简单说明 字典是Python的内置数据结构,将数据与键关联(例如:姓名:张三,姓名是键,张三就是数据).例如:下面这个就是一个字典 {'姓名': '张三', '出生日期': '2899-08 ...
随机推荐
- Hadoop 2.0 中的资源管理框架 - YARN(Yet Another Resource Negotiator)
1. Hadoop 2.0 中的资源管理 http://dongxicheng.org/mapreduce-nextgen/hadoop-1-and-2-resource-manage/ Hadoop ...
- openfire+asmack搭建的安卓即时通讯(五) 15.4.12
这一篇博客其实是要昨天写的,但昨天做了作修改就停不下来了,这次的修改应该是前期开发的最终回了,其余的功能有空再做了,下周可能要做一些好玩的东西,敬请期待! 1.修改下Logo:(Just We) ht ...
- 【ASP.NET 进阶】定时执行任务
原理:利用全局应用程序类 Global.asax 和 System.Timers.Timer 类定时处理任务. 示例效果图: 其 Global.asax 类代码如下: using System; u ...
- 【读书笔记《Android游戏编程之从零开始》】15.游戏开发基础(剪切区域)
剪切区域也称为可视区域,是由画布进行设置的:它指的是在画布上设置一块区域,当画布一旦设置了可视区域,那么除此区域外,绘制的任何内容都将看不到:可视区域可以是圆形.矩形等等. 画布提供了三种设置可视区域 ...
- 【每天一题ACM】 斐波那契数列(Fibonacci sequence)的实现
最近因为一些原因需要接触一些ACM的东西,想想写个blog当作笔记吧!同时也给有需要的人一些参考 话不多说,关于斐波那契数列(Fibonacci sequence)不了解的同学可以看看百度百科之类的, ...
- ckplayer.js视频播放插件
网页中常见的功能就是播放视频,下面介绍的这个ckplayer.js既可以在pc端播放,也可以在手机网页上播放. 可调用flash也可以调用html5播放器: <div id="a1&q ...
- UVA 12532 Interval Product
线段树水题,忽略每个数的大小,只记住他们的正负即可,规规矩矩的代码.不过这是我第一次完全自己写的一次A的代码了.纪念一下... #include <iostream> #include & ...
- java 16 -11 ArrayList存储自定义对象并增强for遍历
需求:ArrayList存储自定义对象并遍历.要求加入泛型,并用增强for遍历. A:迭代器 B:普通for C:增强for LinkedList,Vector,Colleciton,List ...
- Beaufort密码
博福特密码,是一种类似于维吉尼亚密码的替代密码,由弗朗西斯·蒲福(Francis Beaufort)发明.它最知名的应用是M-209密码机.博福特密码属于对等加密,即加密演算法与解密演算法相同 博福特 ...
- ArcGis 获取地理、平面坐标系
ESRI.ArcGIS.Geometry.ISpatialReference spatialReference = spati ...