javascript面向对象程序设计高级特性经典教程(值得收藏)


Posted in Javascript onMay 19, 2016

本文实例讲述了javascript面向对象程序设计的高级特性。分享给大家供大家参考,具体如下:

1.创建对象的三种方式:

第一种构造法:new  Object

var a = new Object();
a.x = 1, a.y = 2;

第二种构造法:对象直接量

var b = { x : 1, y : 2 };

第三种构造法:定义类型

function Point(x, y){
 this.x = x;
 this.y = y;
}
var p = new Point(1,2);

2.访问对象

访问对象的属性
中括号表示法:hero['name']。、
点号表示法:hero.name。
如果访问的属性不存在,会返回undefined。
访问对象的方法
方法名后加一对括号:hero.say()。
像访问属性一个访问方法:hero['say']()。

3.删除属性与方法

//创建一个空对象
var hero = {};
//为hero对象增加属性和方法
hero.name = "JavaScript";
hero.value = "helloworld";
hero.sayName = function(){return "hello " + hero.name;};
//测试
alert(hero.name); //output javascript
alert(hero.sayName()); //output hello javascript
//删除hero对象的name属性
delete hero.name;
//测试
alert(hero.sayName()); //output hello undefined

4.使用this值

//创建一个空对象
var hero = {};
//为hero对象增加属性和方法
hero.name = "javascript";
hero.value = "helloworld";
hero.sayName = function(){return "hello " + this.name;};
//测试
alert(hero.name); //output javascript
alert(hero.sayName()); //output hello javascript

总结:

① 这里的this实际上引用的是“这个对象”或“当前对象”。
② this的用法,大部分人的使用问题都比较多。所以不建议过多使用!

5.内建对象

内建对象大致上可以分为三个组:

① 数据封装类对象 —— 包括Object、Array、Boolean、Number和String。这些对象代表着javascript中不同的数据类型,并且都拥有各自不同的typeof返回值,以及undefined和null状态。

② 工具类对象 —— 包括Math、Date、RegExp等用于提供遍历的对象。

③ 错误类对象 —— 包括一般性错误对象以及其他各种更特殊的错误类对象。它们可以在某些异常发生时帮助我们纠正程序工作状态。

6.Object对象

Object是javascript中所有对象的父级对象,这意味着所有对象都继承于Object对象。

创建一个空对象:

var object = {};
var obj = new Object();

7.Array对象

Array对象用于在单个的变量中存储多个值。

创建一个空Array对象:

var object = {};
var obj = new Array();

例如1:

//反转字符串示例
//定义一个字符串
var str = "a,b,c,d,e,f,g";
//利用String对象的split()方法,将字符串切割成一个数组
var arr = str.split(",");
//利用Array对象的reverse()方法,将数组中元素的顺序颠倒。
arr = arr.reverse();
//测试打印
alert(arr.toString());

8.String对象

String对象与基本的字符串类型之间的区别:

var str = "hello";
var obj = new String("world");
alert(typeof str); //typeof string
alert(typeof obj); //typeof object

例如1:

//判断字符串是否包含指定字符串示例
//定义两个要判断的字符串
var str = "abcdefg";
var substr = "efg";
/*
* 定义判断字符串是否包含指定字符串的函数
*  * 第一个参数:要判断的字符串
*  * 第二个参数:指定的字符串
*/
function sub(str,substr){
//将判断的字符串定义成String对象
var string = new String(str);
//截取判断的字符串
var result = string.substr(string.indexOf(substr),substr.length);
/*
* 判断截取后的字符串是否为空
*  * 为空,说明不包含指定字符串
*  * 不为空,说明包含指定字符串
*/
if(result==substr){
return true;
}else{
return false;
}
}
alert(sub(str,substr));

9.原型(prototype)

函数本身也是一个包含了方法和属性的对象。而现在我们要研究的就是函数对象的另一个属性 —— prototype。

利用原型添加方法与属性
利用自身属性重写原型属性
扩展内建对象
利用原型添加方法与属性

下面创建一个新的函数对象,并设置一些属性和方法:

function Hero(name, color){
 this.name = name;
 this.color = color;
 this.whatareyou = function(){
 return "I am a " + this.color + " " + this.name;
 }
}
var hero = new Hero("javascript","red");
alert(hero.whatareyou()); //output I am a red javascript

为上面的Hero函数对象增加一些属性和方法:

Hero.prototype.price = 100;
Hero.prototype.rating = 3;
Hero.prototype.getInfo = function(){
 return "Rating: " + this.rating + " , Price: " + this.price;
}
alert(hero.getInfo()); //output Rating: 3 , Price: 100

上面的方式,也可以这样去做:

Hero.prototype = {
 price : 100,
 rating : 3,
 getInfo : function(){
   return "Rating: " + this.rating + " , Price: " + this.price;
 }
};

利用自身属性重写原型属性

如果对象的自身属性与原型属性同名该怎么办呢?答案是对象自身属性的优先级高于原型属性。

function Hero(){
 this.name = "jscript";
}
Hero.prototype.name = "javascript";
var hero = new Hero();
alert(hero.name); //output jscript
delete hero.name;
alert(hero.name); //output javascript

扩展内建对象

//为原型 Array对象增加一个判断的函数
Array.prototype.inArray = function(color){
 for(var i = 0, len = this.length; i < len; i++){
 if(this[i] === color){
 return true;
 }
 }
 return false;
}
//定义一个Array对象
var a = ["red", "green", "blue"];
//测试
alert(a.inArray("red")); //true
alert(a.inArray("yellow")); //false

10.继承

如果两个类都是同一个实例的类型,那么它们之间存在着某些关系,我们把同一个实例的类型之间的泛化关系称为“继承”。

继承关系至少包含三层含义:

① 子类的实例可以共享父类的方法。
② 子类可以覆盖父类的方法或扩展新的方法。
③ 子类和父类都是子类实例的“类型”。

在javascript中,并不支持“继承”。也就是说,javascript中没有继承的语法。从这个意义上来说,javascript并不是直接的面向对象语言

11.原型链

原型链是ECMAScript标准制定的默认继承方式。

例如:

function A(){
this.name = "a";
this.toString = function(){return this.name};
}
function B(){
this.name = "b";
}
function C(){
this.name = "c";
this.age = 18;
this.getAge = function(){return this.age};
}
B.prototype = new A();
C.prototype = new B();

解释说明:

将对象直接创建在B对象的prototype属性中,并没有去扩展这些对象的原有原型。

通过new A ( ) 另创建了一个新的实体,然后用它去覆盖该对象的原型。

javascript是一种完全依靠对象的语言,其中没有类(class)的概念。

因此,需要直接用new A ( ) 创建一个实体,然后才能通过该实体的属性完成相关的继承工作。

完成这样的继承实现之后,对 A ( ) 所进行的任何修改、重写或删除,都不会对 B ( ) 产生影响。

只继承于原型:

function A(){}
A.prototype.name = "a";
A.prototype.toString = function(){return this.name};
function B(){}
B.prototype = A.prototype;
B.prototype.name = "b";
function C(){}
C.prototype = B.prototype;
C.prototype.name = "c";
C.prototype.age = 18;
C.prototype.getAge = function(){return this.age};

对象之间的继承(扩展内容,可以不会)(浅复制)

//该函数接受一个对象并返回它的副本
function extendCopy(p){
 var z = {}; //定义一个空的对象z
 for(var i in p){ //var i =0 ; i < p.length ; i++
 z[i] = p[i]; //都当做数组处理的话,可以理解
 }
 //uber属性:将p作为z的父级,将z指向p的原型
 z.uber = p;
 return z;
}
//定义对象a,但是对象a不是函数对象 
var a = {
 name : "a",
 toStr : function(){return this.name;}
}
//定义对象b,但是对象b不是函数对象 
var b = extendCopy(a);
b.name = "b";
b.toStr = function(){return this.uber.toStr() + " , " + this.name;};
//定义对象c,但是对象c不是函数对象 
var c = extendCopy(b);
c.name = 18;
alert(c.toStr()); //output a , b , 18

PS:教程中不少代码排版不太规范,小编这里推荐几款本站javascript代码格式化美化工具供大家使用:

JavaScript代码格式化工具:

JavaScript代码美化/压缩/格式化/加密工具:

jsmin在线js压缩工具:

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript中json操作技巧总结》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
jquery validator 插件增加日期比较方法
Feb 21 Javascript
JS实现三个层重叠点击互相切换的方法
Oct 06 Javascript
jQuery鼠标事件总结
Oct 13 Javascript
Angular-Touch库用法示例
Dec 22 Javascript
将input框中输入内容显示在相应的div中【三种方法可选】
May 08 Javascript
easyui datagrid 表格中操作栏 按钮图标不显示的解决方法
Jul 27 Javascript
node中koa中间件机制详解
Aug 22 Javascript
Vue2几种常见开局方式详解
Sep 09 Javascript
Vue-cli Eslint在vscode里代码自动格式化的方法
Feb 23 Javascript
详解小程序之简单登录注册表单验证
May 13 Javascript
20道JS原理题助你面试一臂之力(必看)
Jul 22 Javascript
何时/使用 Vue3 render 函数的教程详解
Jul 25 Javascript
jQuery获取当前点击的对象元素(实现代码)
May 19 #Javascript
jquery显示隐藏元素的实现代码
May 19 #Javascript
jQuery判断元素是否显示 是否隐藏的简单实现代码
May 19 #Javascript
JavaScript中的ParseInt(&quot;08&quot;)和“09”返回0的原因分析及解决办法
May 19 #Javascript
javascript中JSON.parse()与eval()解析json的区别
May 19 #Javascript
js获取Html元素的实际宽度高度的方法
May 19 #Javascript
js获取隐藏元素宽高的实现方法
May 19 #Javascript
You might like
PHP读取数据库并按照中文名称进行排序实现代码
2013/01/29 PHP
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
2013/03/06 PHP
PHP中source #N问题的解决方法
2014/01/27 PHP
php中strstr、strrchr、substr、stristr四个函数的区别总结
2014/09/22 PHP
php图片处理函数获取类型及扩展名实例
2014/11/19 PHP
PHP7正式版测试,性能惊艳!
2015/12/08 PHP
Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解
2017/10/11 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
Javascript实现的分页函数
2007/02/07 Javascript
js left,right,mid函数
2008/06/10 Javascript
jquery validate.js表单验证的基本用法入门
2010/05/13 Javascript
js获取元素到文档区域document的(横向、纵向)坐标的两种方法
2013/05/17 Javascript
基于jquery的文章中所有图片width大小批量设置方法
2013/08/01 Javascript
Jquery动态添加输入框的方法
2015/05/29 Javascript
javascript实现label标签跳出循环操作
2016/03/06 Javascript
微信小程序 地图定位简单实例
2016/10/14 Javascript
微信小程序 自定义消息提示框
2017/08/06 Javascript
vue实现图书管理demo详解
2017/10/17 Javascript
html中通过JS获取JSON数据并加载的方法
2017/11/30 Javascript
Angular实现的简单定时器功能示例
2017/12/28 Javascript
详解原生JS回到顶部
2019/03/25 Javascript
python计算方程式根的方法
2015/05/07 Python
Python处理Excel文件实例代码
2017/06/20 Python
Python实现采用进度条实时显示处理进度的方法
2017/12/19 Python
python中实现字符串翻转的方法
2018/07/11 Python
python字典值排序并取出前n个key值的方法
2018/10/17 Python
python 获得任意路径下的文件及其根目录的方法
2019/02/16 Python
Linux上使用Python统计每天的键盘输入次数
2019/04/17 Python
python每天定时运行某程序代码
2019/08/16 Python
解决python中的幂函数、指数函数问题
2019/11/25 Python
解决keras backend 越跑越慢问题
2020/06/18 Python
基于HTML5 Canvas的3D动态Chart图表的示例
2017/11/02 HTML / CSS
微信端html5页面调用分享接口示例
2018/03/14 HTML / CSS
应届毕业生自我鉴定范文
2013/12/27 职场文书
数控专业自荐书范文
2014/03/16 职场文书
小程序实现侧滑删除功能
2022/06/25 Javascript