一、类的实现机制

  在javascript中可以使用function关键字来定义一个类。在函数内通过this指针引用的变量或则方法都会成为类的成员。

 function classDemo(){ 
var $testProperty = "xz1024";
this.property = $testProperty;
this.method = function(){
return "this is a test method";
}
}
var $obj = new classDemo();
document.write($obj.property+"<br />");
document.write($obj.method());

  在javascript中,function本身定义就是累的构造函数,来看看使用new创建对象的过程

  1、当解释器遇到new操作符时边创建一个空对象。

  2、开始运行classDemo这个函数,并将其中的this指针都指向这个新建的对象。

  3、因为当给对象不存在的属性赋值时,解释器就会为对象创建该属性。

  4、当函数执行完后,new操作符就返回初始化后的对象。

  通过整个过程,javascript实现了一个简单的面向对象的机制。由此可见,在javacript中,function的定义实际上就是实现一个对象的构造器,是通过函数来完成的。当然,这种方式的缺点也很明显:

  1、讲所有初始化语句、成员定义都放到一起,代码逻辑不侵袭,不易实现复杂功能。

  2、每创建一个类的实例,都要执行一次构造函数,构造函数中定义的属性和方法总是被重复创建。

  另一种定义机制,prototype对象,可以解决构造函数中定义类成员带来得缺点。

二、使用prototype对象定义类成员

  当new一个function时,该对象的成员将自动赋予所创建的对象。

<script>
//定义一个只有一个属性testProp的类
function testClass(){
this.testProp = 1;
}
//使用函数的prototype属性给类定义新成员
testClass.prototype.showProp = function(){
document.write(this.testProp);
}
//创建一个实例
var $obj = new testClass();
//调用通过prototype原型对象定义的showProp方法
$obj.showProp();
</script>

  prototype是一个javascript对象,可以为prototype对象添加、修改、删除方法和属性,从而为一个类添加成员定义。

  需要注意的,原型对象的定义必须在创建类实例的语句之前,否则它将不会起作用。

  prototype对象专用户设计类成员,它是和一个类紧密相关的。prototype还有一个重要属性:constructor,表示对该构造函数的引用。

<script>
function testClass(){
alert('xz1024.com');
}
//调用类的构造函数
testClass.prototype.constructor();
</script>

  

三、优化javascript类的设计模式

  使用无类型对象的构造方法来指定prototype对象,从而实现类的成员定义:

<script>
function Person(){
console.log('这里可以做一些初始化工作..');
/*this.personName = "xz";
this.personAge = 20;*/
}
Person.prototype ={
personName : "tiger",
personAge : 18,
showInfo : function(){
document.write(this.personName + "," + this.personAge );
}
}; var $p = new Person();
$p.showInfo();
</script>

  

四、JS中的共有成员、私有成员和静态成员

  私有成员即在类的内部实现中可以共享成员,不对外公开。Javascript并没有特殊的机制来定义私有成员,但是在JS中,一个函数内部定义的变量陈志伟局部变量,该变量不能够被此函数外的程序访问,却可以被函数内部定义的嵌套函数所访问,在JS中实现私有成员的过程中,正是利用了这一性质。

  在内的构造函数中可以为类添加成员,通过这种方式定义的类成员,实际上共享了再构造函数内部定义的局部变量,这个变量就可以看作类的私有成员。

 <script>
function testClass(){
var $prop = 'this is a private property'; //私有属性成员$prop
function propMethod(){ //私有方法成员propMethod
document.write($prop);
}
this.methodOne = function(){
//在公有成员中改变私有属性的值
$prop = '$prop has been changed';
};
this.methodTwo = function(){
propMethod(); //在共有成员中调用私有方法
}
} var $obj = new testClass();
$obj.methodOne(); //调用公有方法methodOne
$obj.methodTwo(); //调用公有方法methodTwo
</script>

五、Javascript类的静态成员

  静态成员属于一个类的成员,它可以通过“类名.静态成员名”的方式访问。在javascript中,可以给一个函数对象直接添加成员来实现静态成员,因为函数也是一个对象,所以对象的相关操作,对函数同样适用。

<script>
function classDemo(){ //构造函数
}
classDemo.staticProperty = 'sample';
classDemo.staticMethod = function(){
document.write(classDemo.staticProperty);
}
//调用静态方法
classDemo.staticMethod();
</script>

  

Javascript oop深入学习笔记(三)--javascript中类的实现的更多相关文章

  1. javascript oop深入学习笔记(二)--javascript的函数

    一.概述: 函数是进行模块化程序设计的基础, javascript重的的函数不同于其他语言,每个函数都作为一个对象被维护和运行.通过函数对象的性质,可以很方便的将一个函数赋值给一个变量或则讲函数作为参 ...

  2. javascript oop深入学习笔记(一)

    一.定义和实例化一个类: 在OOP的思想中,类是一个很重要的元素,一个类表示了具有相似的一类事物的抽象,通过实例化一个类,可以获得属于该类的一个实例,我们也可以称之为对象. 在javascript中, ...

  3. ArcGIS API for JavaScript 4.2学习笔记[0] AJS4.2概述、新特性、未来产品线计划与AJS笔记目录

    放着好好的成熟的AJS 3.19不学,为什么要去碰乳臭未干的AJS 4.2? 4.2全线基础学习请点击[直达] 4.3及更高版本的补充学习请关注我的博客. ArcGIS API for JavaScr ...

  4. 【学习笔记】JavaScript的基础学习

    [学习笔记]JavaScript的基础学习 一 变量 1 变量命名规则 Camel 标记法 首字母是小写的,接下来的字母都以大写字符开头.例如: var myTestValue = 0, mySeco ...

  5. JavaScript 权威指南-学习笔记(一)

    本文所有教程及源码.软件仅为技术研究.不涉及计算机信息系统功能的删除.修改.增加.干扰,更不会影响计算机信息系统的正常运行.不得将代码用于非法用途,如侵立删! ## JavaScript 权威指南-学 ...

  6. RX学习笔记:JavaScript数组操作

    RX学习笔记:JavaScript数组操作 2016-07-03 增删元素 unshift() 在数组开关添加元素 array.unshift("value"); array.un ...

  7. seaJs学习笔记之javascript的依赖问题

    之前分别为大家介绍了有关javascript中的冲突和性能问题,今天为大家介绍一下有关javascript中的依赖问题.我们将继续就之前javascript中性能问题继续介绍. 先来回顾一下性能问题的 ...

  8. 学习笔记:Javascript 变量 包装对象

    学习笔记:Javascript 变量 包装对象 如下代码,可以输出字符的长度. var str = "Tony"; str.length; 这时再试试以下代码,返回是 undefi ...

  9. 微信小程序开发:学习笔记[5]——JavaScript脚本

    微信小程序开发:学习笔记[5]——JavaScript脚本 快速开始 介绍 小程序的主要开发语言是 JavaScript ,开发者使用 JavaScript 来开发业务逻辑以及调用小程序的 API 来 ...

随机推荐

  1. 题目1437:To Fill or Not to Fill:贪心算法解决加油站选择问题(未解决)

    //贪心算法解决加油站选择问题 //# include<iostream> # include<stdio.h> using namespace std; # include& ...

  2. ZOJ3772 - Calculate the Function(线段树+矩阵)

    题目大意 给定一个序列A1 A2 .. AN 和M个查询 每个查询含有两个数 Li 和Ri. 查询定义了一个函数 Fi(x) 在区间 [Li, Ri] ∈ Z. Fi(Li) = ALi Fi(Li ...

  3. cmake编译win下64位obs

    obs是一款开源编码推流工具,简单易用,非常流行.一次项目中,发现本台式机I3处理器下32位obs推流CPU使用率100%.而使用的第三方设备在64位下,性能较好.所以需要编译64位obs并且编译相应 ...

  4. 第二百六十三天 how can I 坚持

    今天解脱了,放下了,小罗娜,不给力,话说下一步该咋办呢. 鱼不想过双十一自杀了.这都二十二号了,好快. 该把给罗娜说的那些话保存下来.可惜已经删了. 不知道做的对不对,反正就是没缘分,就这样吧. 睡觉 ...

  5. homework-09

    这次作业主要考察C++11的简单用法,个人感觉这样的练习对我这种编程能力比较差的非常有用,加深了对C++11的理解. Lambda的用法 计算“Hello World!”中 a.字母‘e’的个数 b. ...

  6. Android实例-屏幕操持常亮(XE8+小米2)

    相关资料: http://www.bubuko.com/infodetail-163304.html 结果: 1.打开权限Wake lock为True. 第三方单元: unit Android.JNI ...

  7. thymeleaf的属性优先级

    所有Thymeleaf属性定义一个数字优先,建立他们的顺序执行的标签.这个顺序是: Order Feature Attributes 1 Fragment inclusion th:includeth ...

  8. AngularJS 学习笔记二

    AngularJS指令 指令 描述 讲解 ng_app 定义应用程序的根元素. 指令 ng_bind 绑定 HTML 元素到应用程序数据. 简介 ng_click 定义元素被单击时的行为. HTML ...

  9. 11235 - Frequent values

    <算法竞赛入门经典-训练指南>P198 记录一下区间的左右边界就可以了 #include <iostream> #include <stack> #include ...

  10. windows 花式装系统

    目录 一.安装系统前准备 准备U盘 准备好一个制作启动盘的软件 准备系统镜像 二.接下来先制作启动盘(以微PE为例) 三.插上u盘,调BIOS(BIOS即基本输入输出系统) 四.进入PE 五.开始安装 ...