JavaScript面向对象
一、为每个对象动态添加属性或方法
功能:返回对象类型原型的引用
- prototype的使用
格式:class.prototype
场景:
比如说:A写了一个类,交给B,B在使用时发现A写的类的功能有所欠缺,但是B没有权力改写A的文件,这时该怎么办?
Function Person(name1,age1){
This.name=name1;
This.age=age1;
}
Var p1=new Person(‘zhangsan’,30);
p1.sex=’男’
B认为这个类还应该有一个sex属性:
function Preson(name,age){
this.name=name;
This.age=age;
}
var p1=new Person('zhangsan',30);
var p2=new Person('lisi',20); //p2没有sex属性
//以后每次实例化的person类对象都会自动拥有sex属性
//即使是之前创建的person类对象也会自动拥有sex属性
//为Person类添加了一个叫sex的成员属性
Person.prototype.sex='男';
Person.prototype.say=function(){
//为Person类添加了一个say成员方法
alert(this.name+this.age+this.sex);
};
在实际开发中,类内定义思考题1.:
this.speak=function(){}与person.prototype.speak=function(){}有何区别?
以上两种方法,最终都给Person类添加了一个叫speak的方法
第一种:类内定义成员方法,所以使用这个类的程序,都会自动拥有该方法
第二种:类外定义成员方法,只有当前应用程序可以使用speak方法
思考题2.:
l 扩展数组类的功能:
为每一个数组对象添加一个方法,可以查找某个元素的所在位置
Array -->系统自定义类
思考题3:
扩展数字类的功能:
为一个数字对象添加一个方法,该方法的参数为任意数目的整数,然后将所有参数累加到一起,并返回
二、Object类的使用
在Js中,Object是所有类的基类,使用Object类来创建自定义对象时,可以无需定义构造函数
如:在以前,我们需要定义一个人,必须将人这个类定义出来
function Person(){
}
但是,我们可以看出,这个类是空的,里面没有任何属性或方法,通常来讲
这个类的对象一般属于和方法是后添加的
既然这个类是空的,所以我们考虑使用Object类
定义类对象时,不考虑类的类型,只需要存储多个数据,可以考虑使用Object类
如,Object类下有一个方法:
hasOwnProperty(property) ;判断对象下是否具有某个属性
说明object类下的对象都有这个方法
#p#js教程-面向对象编程#e#
三、javascript中模拟类的静态属性
在有些面向对象的语言中,可以使用static关键字定义类的静态属性或方法,这一点,在JavaScript可以进行模拟。
语法:类名.属性名
如:
Math.random(); //使用类名.形式调用的都是静态成员
四、模拟类的私有属性
- 在面向对象思想中,对于有些敏感的,不想公开的成员可以定义为私有的,在JavaScript中可以模拟这个功能。
语法:
function Person(p_name){
var name = p_name; //在类内定义属性时前面加var表示私有的
//私有成员不能在外面被访问
//如果想设置私有成员属性值,可以通过
//构造函数传参
}
五、模拟类的继承功能
l 语法:
Object.prototype.ext=function(parObject){
for(var i in parObject){
this[i]=parObject[i];
}
};
什么情况下使用继承?
有一个类,我们可以使用这个类,但这个类的功能不够完善,我们还不能修改它的源代码,所以需要在自己的类中继承这个类
举例:
Function Person()
{
This.name
This.age
This.say=function
}
但是,我们想完成对一个学生的描述,这时Person类里没有学号,所以我们要继承Person;
六、javascript闭包
所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
什么时候用闭包
想访问函数内部的变量时
让函数内部的变量始终保存在内存中
function test1(){
i=100;
function test2(){
alert(i++);
}
return test2; 返回test2函数的首地址给一个全局变量
这里用到了变量i,所以i的值不会消失,这就是闭包
}
var result=test1();
result();
七、try…catch语句
- 我们可以添加 try...catch 语句,这样当错误发生时可以采取更适当的措施。
语法:
try{
//要执行的语句
//当这些语句出现错误时,会被catch捕获,从而执行catch语句中指定的内容
}
catch(error){
}
有时,我们可能故意让程序的catch语句运行
Throw语句
- throw 声明的作用是创建 exception(异常)。你可以把这个声明与 try...catch 声明配合使用,以达到控制程序流并产生精确错误消息的目的。
八、关于调试
1) 设置断点:程序运行到这里会自动停止
2) 使用逐语句:遇到函数时会进入到函数的内部
3) 使用逐过程:遇到函数时,直接取函数的运行结果,而不是进入函数
九、JavaScript作用域链
js面向对象编程-高级内容的更多相关文章
-
带你一分钟理解闭包--js面向对象编程
上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...
-
大数据技术之_16_Scala学习_06_面向对象编程-高级+隐式转换和隐式值
第八章 面向对象编程-高级8.1 静态属性和静态方法8.1.1 静态属性-提出问题8.1.2 基本介绍8.1.3 伴生对象的快速入门8.1.4 伴生对象的小结8.1.5 最佳实践-使用伴生对象解决小孩 ...
-
Js面向对象编程
Js面向对象编程 1. 什么是面向对象编程? 我也不说不清楚什么是面向对象,反正就那么回事吧. 编程有时候是一件很快乐的事,写一些小游戏,用编程的方式玩游戏等等 2. Js如何定义一个 ...
-
js原生设计模式——3简单工厂模式\js面向对象编程实例
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
-
JS面向对象编程(进阶理解)
JS 面向对象编程 如何创建JS对象 JSON语法声明对象(直接量声明对象) var obj = {}; 使用 Object 创建对象 var obj = new Object(); JS对象可以后期 ...
-
页面循环绑定(变量污染问题),js面向对象编程(对象属性增删改查),js字符串操作,js数组操作
页面循环绑定(变量污染问题) var lis = document.querySelectorAll(".ul li") for ( var i = 0 ; i < lis. ...
-
js面向对象编程 ---- 系列教程
原 js面向对象编程:数据的缓存 原 js面向对象编程:如何检测对象类型 原 js面向对象编程:if中可以使用那些作为判断条件呢? 原 js面向对象编程:this到底代表什么?第二篇 原 js面向对象 ...
-
简单粗暴地理解js原型链–js面向对象编程
简单粗暴地理解js原型链–js面向对象编程 作者:茄果 链接:http://www.cnblogs.com/qieguo/archive/2016/05/03/5451626.html 原型链理解起来 ...
-
JS面向对象编程,对象,属性,方法。
document.write('<script type="text/javascript" src="http://api.map.baidu.com/api?v ...
随机推荐
-
js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
-
DB监控-redis监控
公司的redis业务很多,redis监控自然也是DB监控的一大模块,包括采集.展示.监控告警.本文主要介绍redis监控的主要指标和采集方法. 一.Redis监控系统逻辑 1.DBA通过前台页面添加r ...
-
Android 从网络中获取数据时 产生部分数据乱码的解决
产生部分数据乱码的解决 标签: android部分中文乱码 2014-04-12 23:24 12366人阅读 评论(10) 收藏 举报 分类: [Android 基础](15) 版权声明:本文为博主 ...
-
AutoCAD.NET 不使用P/Invoke方式调用acad.exe或accore.dll中的接口(如acedCommand、acedPostCommand等)
使用C#进行AutoCAD二次开发,有时候由于C#接口不够完善,或者低版本AutoCAD中的接口缺少,有些工作不能直接通过C#接口来实现,所以需要通过P/Invoke的方式调用AutoCAD的其他DL ...
-
基于Android_volley的Get、Post的方法
用Android_volley加载网络信息有Get,post两种方式,通过一个例子来说明,在Activity中设置两个Button,分别测试Get.post方法 一般分为三步, 1. 创建一个Requ ...
-
os即时通讯客户端开发之-mac上安装MySQL
一.安装 到MySQL官网上http://dev.mysql.com/downloads/mysql/,下载mysql可安装dmg版本 比如:Mac OS X ver. 10.7 (x86, 64-b ...
-
Redis简介四
一..NET使用Redis 和MongoDB一样,在.NET中使用Redis其实也是使用第三方驱动,官网推荐的是使用ServiceStack.Redis(https://github.com/Serv ...
-
Java 重写hashCode 方法和equals方法
package Container; import java.util.HashSet; import java.util.Iterator; /* Set 元素是无序的(存入和取出的顺序不一定一致) ...
-
如何判断Linux 是32位还是64位
.运行 'uname -m' 命令 上面的命令内涵太多了,可以用这个参数直指人心:'uname -m' . 例如,在我的系统里,它显示了以下信息: $ uname -m i686
-
第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery )
一. 前言 在前面的两个章节中,我们分别详细介绍了EF的增删改的两种方式(方法和状态)和EF查询的两种方式( Lambda和Linq ),进行到这里,可以说对于EF,已经入门了,本来应该继续往下进行E ...