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 相关文章推荐
js实现屏蔽默认快捷键调用自定义事件示例
Jun 18 Javascript
利用javascript实现web页面中指定区域打印
Oct 30 Javascript
IE的事件传递-event.cancelBubble示例介绍
Jan 12 Javascript
3种js实现string的substring方法
Nov 09 Javascript
微信小程序 swiper制作tab切换实现附源码
Jan 21 Javascript
js控制按钮,防止频繁点击响应的实例
Feb 15 Javascript
jQuery实现移动端Tab选项卡效果
Mar 15 Javascript
angular框架实现全选与单选chekbox的自定义
Jul 06 Javascript
Koa2 之文件上传下载的示例代码
Mar 29 Javascript
angular ng-model 无法获取值的处理方法
Oct 02 Javascript
Vue实现回到顶部和底部动画效果
Jul 31 Javascript
Vue的生命周期操作示例
Sep 17 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 上传文件大小限制
2009/07/05 PHP
谈PHP生成静态页面分析 模板+缓存+写文件
2009/08/17 PHP
codeigniter实现get分页的方法
2015/07/10 PHP
浅谈php和js中json的编码和解码
2016/10/24 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
浅谈Laravel模板实体转义带来的坑
2019/10/22 PHP
laravel 框架执行流程与原理简单分析
2020/02/01 PHP
php使用自带dom扩展进行元素匹配的原理解析
2020/05/29 PHP
javascript中Object使用详解
2015/01/26 Javascript
JavaScript对数字的判断与处理实例分析
2015/02/02 Javascript
jfinal与bootstrap的登录跳转实战演习
2015/09/22 Javascript
学习JavaScript设计模式之状态模式
2016/01/08 Javascript
js插件Jcrop自定义截取图片功能
2016/10/14 Javascript
JQuery判断正整数整理小结
2017/08/21 jQuery
ES6模板字符串和标签模板的应用实例分析
2019/06/25 Javascript
微信小程序转发事件实现解析
2019/10/22 Javascript
Vue.js 无限滚动列表性能优化方案
2019/12/02 Javascript
用生成器来改写直接返回列表的函数方法
2017/05/25 Python
人生苦短我用python python如何快速入门?
2018/03/12 Python
Python 实现一行输入多个值的方法
2018/04/21 Python
使用python的pandas库读取csv文件保存至mysql数据库
2018/08/20 Python
对Python 多线程统计所有csv文件的行数方法详解
2019/02/12 Python
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
2019/03/05 Python
Python3.5 + sklearn利用SVM自动识别字母验证码方法示例
2019/05/10 Python
python可视化实现KNN算法
2019/10/16 Python
使用 Python 遍历目录树的方法
2020/02/29 Python
高中体育教学反思
2014/01/24 职场文书
财务总监岗位职责
2014/03/07 职场文书
投标诚信承诺书
2014/05/26 职场文书
幼师求职自荐信
2014/05/31 职场文书
祖国在我心中演讲稿600字
2014/09/23 职场文书
个人三严三实对照检查材料
2014/09/25 职场文书
诉讼代理人授权委托书
2014/10/11 职场文书
2014年学校禁毒工作总结
2014/12/23 职场文书
PHP命令行与定时任务
2021/04/01 PHP
python绘制箱型图
2021/04/27 Python