说到js,非常大一部分人会说我非常熟悉,在日常的web开发中经经常使用,那么你的js代码是符合面对对象思路的吗?那你会问我面向过程的js代码有什么不好吗?我的感受是面对对象的js编码更加简洁,降低了混乱,可维护行增强,适合编写富client时应用。

好了,首先看看js里怎样定义对象:

<html>
<head>
<script type="text/javascript"> var obj=new Object();
obj.name='josh';
obj.age='26';
console.log(obj.name);
console.log(obj.age); </script>
</head>
<body>
</body>
</html></span>

大家能够用firebug的console看下执行结果。在这段很easy的代码中。我们new了一个Object型的对象,假设学过像java或C#这样面向对象语言的人,对这种对象定义方式一定很熟悉,仅仅只是开头的变量定义换成了var,这是因为js是弱类型的缘故。

Object类型属于js的内置对象类型,定义了obj之后,我们给obj的name和age属性进行了赋值。

这里须要注意的事,js的对象能够动态加入属性和方法。不像java,对象仅仅能包括类的内容。我们在上面的代码中再加入两个方法:

var obj=new Object();
obj.name='josh';
obj.age='26';
obj.getName=function(){
return this.name;
}
obj.getAge=function(){
return this.age;
}
console.log(obj.getName());
console.log(obj.getAge());

既然能加入,也能删除:

var obj=new Object();
obj.name='josh';
obj.age='26';
obj.getName=function(){
return this.name;
}
obj.getAge=function(){
return this.age;
}
delete obj.age;
delete obj.getAge;
console.log(obj.age); //undefined
console.log(obj.getAge()); //obj.getAge is not a function

那么js对象的动态加入属性方法的机制是什么呢?在最根本的层面上,js对象是一个属性的集合,很类似于其它语言中的哈希表,或者在java里更为经常使用的map,因此我们能够再使用的不论什么时候。动态的加入属性或方法。

在js中,对象被觉得是引用类型。为不同的变量赋同样对象的话,那么运行的就是同一对象

var obj=new Object();
obj.name='josh';
obj.age='26';
obj.getName=function(){
return this.name;
}
obj.getAge=function(){
return this.age;
}
obj1=obj;
obj.age='30';
console.log(obj1.getAge());

好了,上面的用的object对象,属于js的内置对象,除了Object类型还有Function。Array。Date,Error,Regexp,这些内置对象类型都属于引用类型

var func=new Function('console.log("Hi");');
var arr=new Array('Eric','lisa','josh');
var date=new Date();
var error=new Error("something bad happen");
var reg=new RegExp('\\d+');

js还提供了5中原始类型:各自是Boolean,Number,String。Null,Undefined。

//string
var name='Eric';
var selection='a'; //number
var num=10;
var f=1.1; //boolean
var flag=false; //null
var obj=null; //undefined
var ref;

大家须要知道的事,Number类型既能够包括整形。也能够包括浮点型。

这里也须要说说null和undefined的差别,undefined表示变量定义了。但未初始化,null表示对象不存在。

之所以介绍原始类型,是由于大家寻常会见到这种代码:

var name='Eric';
var lowcasename=name.toLowerCase(); //eric
var fistLetter=name.charAt(0); //E

就是在原始类型的的变量上调用了方法。这事实上是js的内容为我们实现了一个装箱的机制

var name='Eric';
// 将原始类型使用new建立了一个相应的对象类型
var temp=new String(name);
var lowcasename=temp.toLowerCase(); //eric
var fistLetter=temp.charAt(0); //E

除了上述使用new的方式简历对象,还能够使用literal Form(字符串)的方式

//new object 的方式
var obj=new Object();
obj.name='josh';
obj.age='26';
obj.getName=function(){
return this.name;
}
obj.getAge=function(){
return this.age;
} //literal Form
var obj1={
name:'josh',
age:'26',
getName:function(){
return this.name;
},
getAge:function(){
return this.age;
}
} //new Array的方式
var arr=new Array('Eric','lisa','josh');
//literal Form
var arr1=['Eric','lisa','josh'];

至此,本文讲了 js对象动态增删属性及其机制,js的内置原始类型和引用类型 还有对象的两种定义方式。有了这些基础。我们后将陆续解说js对象的方方面面。包含继承、封装和多态。

js面对对象编程的更多相关文章

  1. js面对对象编程(二):属性和闭包

    上篇博客中解说了一些js对象的基本概念和使用方法.这篇博客解说一下js属性方面的:公有属性.私有属性,特权方法. 假设学过java.公有属性.私有属性,特权方法(即能够訪问和设置私有属性的方法)一定非 ...

  2. 对js 面对对象编程的一些简单的理解

    由简单开始深入: 最简单的 直接对象开始 var desen = { age:24, name:'xyf', job:'fontEnd', getName:function(){ console.lo ...

  3. python面对对象编程----2:__init__

    面对对象编程估计我们最早接触到的就是__init__了,也就是实例的初始化处理过程: 1:来看看最基础的__init__ class Card(object): #抽象类Card,并不用于实例化 de ...

  4. 面对对象编程(OOP, Object Oriented Programming)及其三个基本特性

    一千个读者,一千个哈姆雷特.对于面对对象编程,书上都会告诉我们它有三个基本特性,封装,继承,多态,但谈起对这三点的见解,又是仁者见仁智者见智,感觉还是得多去编程中体验把 . 面向对象编程(OOP, O ...

  5. Python学习6——再谈抽象(面对对象编程)

    1.对象魔法 在面对对象编程中,术语对象大致意味着一系列数据(属性)以及一套访问和操作这些数据的方法. 使用对象而非全局变量以及函数的原因有多个,而最重要的好处不过以下几点: 多态:可对不同类型的对象 ...

  6. C++ 基础语法 快速复习笔记---面对对象编程(2)

    1.C++面对对象编程: a.定义: 类定义是以关键字 class 开头,后跟类的名称.类的主体是包含在一对花括号中.类定义后必须跟着一个分号或一个声明列表. 关键字 public 确定了类成员的访问 ...

  7. Day-8: 面对对象编程

    面对过程的程序设计方法意在将函数分成子函数,再依次调用这些函数来解决问题. 而面对对象的程序设计方法,来源于自然界,类是实例的抽象,实例是类的具体.自定义出来的对象是类,而所有的数据都可以看成是对象, ...

  8. 跟着百度学PHP[4]OOP面对对象编程-7-OOP的一些关键子讲解

    面对对象常用的一些关键子:http://www.cnblogs.com/xishaonian/p/6146794.html排版不是很好望见谅. THE END

  9. 跟着百度学PHP[4]-OOP面对对象编程-1-什么是面对对象编程

    该阶段学习参考:http://www.cnblogs.com/xiaochaohuashengmi/archive/2010/09/10/1823042.html 面向对象编程(Object Orie ...

随机推荐

  1. [GraphQL] Query a GraphQL API with graphql-request

    To query a GraphQL API, all you need to do is send an HTTP request that includes the query operation ...

  2. POJ 1040 Transportation

    链接:http://poj.org/problem?id=1040 Transportation Time Limit: 1000MS Memory Limit: 10000K Total Submi ...

  3. PS如何制作超酷3D字效果

    效果图.jpg (24.94 KB) 2008-4-4 21:46 1.打开PS 执行文件-新建-新建550X400像素空白文档 1.jpg (36.69 KB) 2008-4-4 21:46 2.输 ...

  4. 10.3.1 一个CONNECT BY的样例

    10.3.1 一个CONNECT BY的样例正在更新内容,请稍后

  5. Ajax系列之中的一个:ajax旧貌换新颜

    什么是ajax? 什么是Ajax? Ajax就是Asynchronous +JavaScript+XML.中文翻译为:异步的javascript与XML,它是利用javascript语言和xml数据实 ...

  6. 无法连接到服务器,用户xxx登陆失败"

    无法连接到服务器,用户xxx登陆失败" 该错误产生的原因是由于SQL Server使用了"仅 Windows"的身份验证方式, 因此用户无法使用SQL Server的登录 ...

  7. 【Lucene】Apache Lucene全文检索引擎架构之构建索引2

    上一篇博文中已经对全文检索有了一定的了解,这篇文章主要来总结一下全文检索的第一步:构建索引.其实上一篇博文中的示例程序已经对构建索引写了一段程序了,而且那个程序还是挺完善的.不过从知识点的完整性来考虑 ...

  8. FishiGUI系统架构分析 和层次结构 二

    FishiGUI的类型 FIshiGUI属于为应用程序提供图形界面服务的框架系统.它并不直接与终于用户交互(负责与终于用户交互的是在FishiGUI基础上开发的应用程序).而是接受操作系统传来的硬件消 ...

  9. 在ubuntu1604上使用aria2下载coco数据集效率非常高

    简单的下载方法: 所以这里介绍一种能照顾大多数不能上外网的同学的一种简单便捷,又不会中断的下载方法:系统环境: Ubuntu 14.04 方法: a. 使用aria2 搭配命令行下载.需要先安装: s ...

  10. eclipse导入svn工程,在文件夹里面不展示svn工程图标

    原因:没有安装subclipse插件 解决方法:在marketplace中搜索插件名字:subclipse,点击安装,或者在instal new software中输入插件名字,安装完成之后,在文件夹 ...