[Javascript] 面向对象编程思想
1.创建对象
1.1 new
用new进行创建对象:
var user = new Object();
user.age = 12;//同时为对象添加属性
user.name = ‘ajun’;
1.2{}
用{}创建对象,如:
var user = {
‘name’:’ajun,
‘age’:12
}
这里同时候为user添加了两个属性分别为:name,age
在以上代码稍加改造,你还可以为一个对象添加一个方法,如:
var user = {
‘name’:’ajun’,
‘age’:12
‘say’:function(){
alert(this.name);//this代表当前对象
}
}
2.类和构造函数
2.1如何定义
在javascript中,所有的变量和方法都是对象,都可以用做参数相互传递的。
看以下这个方法:
function User(name,age){
this.name = name;
this.age = age;
this.say = function(){
alert(this.name+’ say hello!!’);
}
}
此时你可以这样理解,User你可以看成一个类的名字,而User()就是这个类得构造方法,这点有点类似于java中的类和构造方法必须同名,在new 的时候调用其构造方法,一些初始化操作,可以放在你的构造方法内,这里我们用于初始化name和age属性的值,以下创建User对象的代码:
var user = new User(‘ajun’ ,24);
user.say();//ajun say hello!!
在这里解释以下this:
当我们在new对象的时候,实际会调用一个被叫做的call(),将当前对象做为参数传递进行,赋值给this,所以this就是指当前引用对象
3.原型
3.1 prototype
在 JavaScript 中,每个方法都有名为“prototype”的属性,用于引用原型对象,看如下代码:
function User(){
this.name = ‘ajun’;
this.age = 24;
this.say = function(){
alert(this.name+’ say hello!!’);
}
}
这个User就会有prototype的属性,引用的时候就可以这样 User.prototype 就可以了,当你new User对象的时候,这个对象就会继承来自User. prototype的所有的属性,而User. prototype又继承自Object.prototype的所有的属性,所以你才可以在你对象上调用toString()等方法,其实他都是 Object. Prototype的属性,只是被你的对象继承过来了而已,在这里你可以理解为java的类得继承,子类继承父类。
有prototype的概念,我们就可以通过prototype给User添加方法、属性了,这样以后每个user对象都共享方法和属性,而不是每个对象都会有他们的副本了。
function User(){
this.name = ‘ajun’;
this.age = 24;
}
User. prototype. say = function(){
alert(this.name+’ say hello!!’);
}
var user = new User();
user.say();
var user2 = new User();
user2.say();
这样我们在new 完一个User对象的时候,调用完这个方法的时候,他还可以供其他方法继续使用。
3.2原型链
每个 JavaScript对象都继承一个原型链,而所有原型都终止于 Object.prototype。注意,迄今为止您看到的这种继承是活动对象之间的继承。它不同于继承的常见概念,后者是指在声明类时类之间的发生的继承。因此,JavaScript 继承动态性更强。它使用简单算法实现这一点,如下所示:当您尝试访问对象的属性/方法时,JavaScript 将检查该属性/方法是否是在该对象中定义的。如果不是,则检查对象的原型。如果还不是,则检查该对象的原型的原型,如此继续,一直检查到 Object.prototype。
JavaScript 动态地解析属性访问和方法调用的方式产生了一些特殊效果:
@ 继承原型对象的对象上可以立即呈现对原型所做的更改,即使是在创建这些对象之后。
@ 如果在对象中定义了属性/方法 X,则该对象的原型中将隐藏同名的属性/方法。例如,
通过在 User.prototype 中定义 toString 方法,可以改写Object.prototype 的 toString 方法。
@ 更改只沿一个方向传递,即从原型到它的派生对象,但不能沿相反方向传递。
例子:
function User(){
this.name = ‘ajun’;
this.age = 24;
}
User. prototype. toString = function(){
alert(this.name+’ say hello!!’);
}
var user = new User();
user. toString ();
此时Object.prototype的toString会被覆盖掉。这样就不会调用Object.prototype的toString了,也就不会输出[Object Object],而输出的是ajun say hello!!了
4.静态属性和方法
有的时候 ,你想不想就像java中那样,通过类直接来操作你的属性和方法,其实在java中这些都是静态属性啦,直接通过类名来引用,在JavaScript中也是可以做的,请看下面的代码:
function User(){}
User.age = 12;
User.name = ‘ajun’;
User.say = function(){
return ‘ajun’;
}
alert(User.say());
之后就可以用方法名字直接引用你的方法或者属性了,而不用在new一次对象了。
5.私有属性
正常情况下,无法从函数以外访问函数内的本地变量。函数退出之后,由于各种实际原因,该本地变量将永远消失。但是,如果该本地变量被内部函数的闭包捕获,它就会生存下来。这一事实是模拟 JavaScript 私有属性的关键,如:
function User(name,age){
this.setName = function(newName){
name = newName;//name相当于setName的name属性
};
this.getName = function(){
return name;
}
this.getAge = function(){
return age;
};
this.setAge = function(newAge){
age = newAge;
};
}
var user = new User('ajun',24);
alert(user.getName)//ajun
user.setName('lisi',12);
var newName = user.getName();
alert(newName);//lisi
或者这样也是可以模拟似有属性的,因为name超出其作用域,是不可以被访问的
function User (name, age) {
var name;
this.getName = function() { return name; };
this.setName = function(newName) {
name = newName;
};
}
var user = new User ('ajun’,12);
user. setName('qq');
alert(p.getName());
注意:你设定的私有属性,是不能被这个方法内的其他公共方法访问的(指的是共享的方法,通过User.prototype定义的方法),这一点和java是不类似的
只能通过在其闭包内拥有这些私有成员的方法来访问私有成员
如:下面的代码 ,是不可以工作的
User.prototype.somePublicMethod= function() {
alert(this.getName());
}
5.命名空间
这里所说的命名空间就相当于我们在java中使用包的概念,这样可以防止方法名冲突,代码如下:
//命名空间
var AJUN = {};
AJUN.Examples = {};
AJUN.Examples.User=function(){
this.setName = function(newName){
name = newName;
};
this.getName = function(){
return name;
}
this.getAge = function(){
return age;
};
this.setAge = function(newAge){
age = newAge;
};
}
var user = new AJUN.Examples.User();
user.setName('ajun');
alert(user.getName());
[Javascript] 面向对象编程思想的更多相关文章
- 面向对象编程思想(前传)--你必须知道的javascript
在写面向对象编程思想-设计模式中的js部分的时候发现很多基础知识不了解的话,是很难真正理解和读懂js面向对象的代码.为此,在这里先快速补上.然后继续我们的面向对象编程思想-设计模式. 什么是鸭子类型 ...
- 面向对象编程思想(前传)--你必须知道的javascript(转载)
原文地址:http://www.cnblogs.com/zhaopei/p/6623460.html阅读目录 什么是鸭子类型 javascript的面向对象 封装 继承 多态 原型 this指向 ...
- 深入理解Javascript面向对象编程
深入理解Javascript面向对象编程 阅读目录 一:理解构造函数原型(prototype)机制 二:理解原型域链的概念 三:理解原型继承机制 四:理解使用类继承(继承的更好的方案) 五:建议使用封 ...
- 探讨javascript面向对象编程
(个人blog迁移文章.) 前言: 下面将探讨javascript面向对象编程的知识. 请不要刻意把javascript想成面向对象编程是理所当然的. javascript里面,对象思想不可少,但是不 ...
- JavaScript面向对象编程小游戏---贪吃蛇
1 面向对象编程思想在程序项目中有着非常明显的优势: 1- 1 代码可读性高.由于继承的存在,即使改变需求,那么维护也只是在局部模块 1- 2 维护非常方便并且成本较低. 2 这个demo是采用了 ...
- javascript面向对象编程,带你认识封装、继承和多态
原文链接:点我 周末的时候深入的了解了下javascript的面向对象编程思想,收获颇丰,感觉对面向对象编程有了那么一丢丢的了解了~很开森 什么是面向对象编程 先上一张图,可以对面向对象有一个大致的了 ...
- 聚焦JavaScript面向对象的思想
面向对象是一种软件开发方法,是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物.随着时代的发展,计算机被用于解决越来越复杂的问题.一切事物皆对象,通过面向对象的方式,将现实世界的 ...
- JavaScript面向对象编程学习笔记
1 Javascript 面向对象编程 所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量.对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例 ...
- 快速学习JavaScript面向对象编程
到处都是属性.方法,代码极其难懂,天哪,我的程序员,你究竟在做什么?仔细看看这篇指南,让我们一起写出优雅的面向对象的JavaScript代码吧! 作为一个开发者,能否写出优雅的代码对于你的职业生涯至关 ...
随机推荐
- 新 esb-cs-tool.jar 参数说明
旧esb-cs-tool.jar 使用说明 : invoke(RequestBusinessObject requestBo) 旧参数说明: requestBo : 封装好的请求参数大对象 Req ...
- 详解keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法
一.关于全局变量的定义.声明.引用: (只要是在.h文件中定义的变量,然后在main.c中包含该.h文件,那么定义的变量就可以在main函数中作为全局变量使用) 方法1: 在某个c文件里定义全局变量后 ...
- RAID对硬盘的要求及其相关
Raid 0:至少需要两块硬盘,磁盘越多,读写速度越快,没有冗余. Raid 1:只能用两块硬盘,两块硬盘的数据互为镜像(写慢,读快),一块磁盘冗余. Raid 5:至少需要3块硬盘,一块磁盘冗余. ...
- UIView UITableView 背景图片添加
这几天,经常用到为某个视图设置背景图片,而API中UIView没有设置背景图片的方法,搜集归纳如下: 第一种方法: 利用的UIView的设置背景颜色方法,用图片做图案颜色,然后传给背景颜色. UICo ...
- Oracle Standby Database 实现方案
Oracle Standby Database 实现方案 From: http://wanow.blog.hexun.com/4672755_d.html 字号:大 中 小 版本:V20060328 ...
- How Tomcat Works(二)
我们这些可怜虫,只有沿着大神的思路,这样我们才能进步得更快:因为我们不是跟大神处于同一级别上.所以我这里是参考<How Tomcat Works>这本英文版的大作来理解tomcat的工作原 ...
- CentOS常用查看系统命令
系统 uname -a 查看内核/操作系统/CPU信息head -n 1 /etc/issue 查看操作系统版本cat /proc/cpuinfo 查看C ...
- C:冒泡排序
冒泡排序 C语言在运行的时候,不会帮我们检查数组的下标. 冒泡排序:有n个数字,需要进行 n - 1 趟比较大小(元素的个数减去 1).外层循环 for( int i = 0; i < coun ...
- javaScript hook
今天在网上搜索了不少资料,基本概念如下: 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的.当消息到 ...
- 转载:你可能没注意的CSS单位
出自:http://www.cnblogs.com/dolphinX/p/4097693.html 扶今追昔 CSS中的单位我们经常用到px.pt.em.百分比,px和pt不用多说 em em是相对单 ...