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 相关文章推荐
用JavaScript计算在UTF-8下存储字符串占用字节数
Aug 08 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
Apr 25 Javascript
a标签click和href执行顺序探讨
Jun 23 Javascript
JavaScript函数详解
Feb 27 Javascript
使用npm发布Node.JS程序包教程
Mar 02 Javascript
深入浅析Node.js 事件循环
Dec 20 Javascript
jquery使用on绑定a标签无效 只能用live解决
Jun 02 Javascript
JS实现快速的导航下拉菜单动画效果附源码下载
Nov 01 Javascript
基于js的变量提升和函数提升(详解)
Sep 17 Javascript
Bootstrap 树控件使用经验分享(图文解说)
Nov 06 Javascript
express express-session的使用小结
Dec 12 Javascript
js实现掷骰子小游戏
Oct 24 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
重置版宣传动画
2020/04/09 魔兽争霸
PHP程序员编程注意事项
2008/04/10 PHP
php初学者写及时补给skype用户充话费的小程序
2008/11/02 PHP
joomla内置的表单验证功能使用方法
2010/06/11 PHP
php定时删除文件夹下文件(清理缓存文件)
2013/01/23 PHP
深入Apache与Nginx的优缺点比较详解
2013/06/17 PHP
实例介绍PHP删除数组中的重复元素
2019/03/03 PHP
对textarea框的代码调试,而且功能上使用非常方便,酷
2006/06/30 Javascript
获取URL地址中的文件名和参数的javascript代码
2009/09/02 Javascript
node.js中的fs.unlinkSync方法使用说明
2014/12/15 Javascript
javascript实现 百度翻译 可折叠的分享按钮列表
2015/03/12 Javascript
JS表格组件神器bootstrap table详解(强化版)
2016/05/26 Javascript
jQuery操作dom实现弹出页面遮罩层(web端和移动端阻止遮罩层的滑动)
2016/08/25 Javascript
Node.js利用Net模块实现多人命令行聊天室的方法
2016/12/23 Javascript
jQuery实现radio第一次点击选中第二次点击取消功能
2017/05/15 jQuery
解决微信小程序中转换时间格式IOS不兼容的问题
2019/02/15 Javascript
Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验
2019/04/22 Javascript
关于layui导航栏不展示下拉列表的解决方法
2019/09/25 Javascript
vue模块移动组件的实现示例
2020/05/20 Javascript
基于vuex实现购物车功能
2021/01/10 Vue.js
python列表操作之extend和append的区别实例分析
2015/07/28 Python
Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)
2018/04/18 Python
python抽取指定url页面的title方法
2018/05/11 Python
详解pyenv下使用python matplotlib模块的问题解决
2018/11/29 Python
使用Python将Exception异常错误堆栈信息写入日志文件
2020/04/08 Python
matplotlib 对坐标的控制,加图例注释的操作
2020/04/17 Python
将pymysql获取到的数据类型是tuple转化为pandas方式
2020/05/15 Python
森海塞尔美国官网:Sennheiser耳机与耳麦
2017/07/19 全球购物
药剂学专业应届生自荐信
2013/09/29 职场文书
工艺员岗位职责
2014/02/11 职场文书
党校学习自我鉴定
2014/02/24 职场文书
教师见习期自我鉴定
2014/04/28 职场文书
四风问题个人剖析材料
2014/10/07 职场文书
交通事故调解协议书
2015/05/20 职场文书
财务管理制度范本
2015/08/04 职场文书
Python进度条的使用
2021/05/17 Python