封装:javascript中创建对象的模式中,个人认为通过闭包才算的上是真正意义上的封装,所以首先我们先来简单介绍一下闭包,看下面这个例子:

1. <script type="text/javascript">
2. function myInfo(){
3. var name ="老鱼",age =27;
4. var myInfo = "my name is" + name + "i am" + age +"years old";
5. function showInfo(){
6. alert(myInfo);
7. }
8. return showInfo;
9. }
10. var oldFish = myInfo();
11. oldFish();
12. </script>

是不是很眼熟呢?没错了,这其实就是一个简单的闭包应用了。简单解释一下:上面的函数myInfo中定义的变量,在它的内嵌函数showInfo中是可访问的(这个很好理解),但是当我们把这个内嵌函数的返回引用赋值给一个变量oldFish,这个时候函数showInfo是在myInfo函数体外被调用,但是同样可以访问到定义在函数体内的变量。oh yeah!

总结一下闭包的原理吧:函数是运行在定义他们的作用域中而不是调用他们的作用域中。其实返回一个内嵌函数也是创建闭包最常用的一种方法!

如果觉得上面的解释太抽象的话,那么我们一起重塑上面的函数,看看这样是否层次鲜明一些:

1. <script type="text/javascript">
2. var ioldFish = function(name,age){
3. var name = name,age = age;
4. var myInfo = "my name is" + name + "i am" + age +"years old";
5. return{
6. showInfo:function(){
7. alert(myInfo);
8. }
9. }
10. }
11. ioldFish("老鱼",27).showInfo();
12. </script>

上例中的编码风格是ext yui中比较常见的,公私分明,一目了然。通过闭包,我们可以很方便的把一些不希望被外部直接访问到的东西隐藏起来,写的挺累,饶了一圈终于转回来了,封装嘛,不就是把不希望被别人看到的东西隐藏起来嘛!哈哈……当然javascript中还有”潜规则”式的封装形态,是开发者之间都达成共识的一种伪封装模式,就是人为的在私有变量和方法前加下划线”_”,标识警戒讯号!可能有人会问,哪种模式好呢?这个怎么说呢?两种方式都有优缺点,结合着用呗!总之一个原则,一定一定不能直接被外部对象访问的东西,就用闭包封装吧。”一定一定”四个字很深奥,不断实践中才能体会真谛!

继承:提到这个的时候,要顺便再补充一句:上例封装中的一个缺点,不利于子类的派生,所以闭包有风险,封装需谨慎!直观起见,下面例子中创建对象的方式,采用”门户大开型”模式。

在javascript中继承一般分为三种方式:”类式继承”,”原型继承”,”掺元类”。下面简单的介绍一下三类继承方式的原理。

A.类式继承:这个是现在主流框架中常用的继承方式,看下例:

1. <script type="text/javascript">
2. var Name = function(name){
3. this.name = name;
4. };
5. Name.prototype.getName = function(){
6. alert(this.name);
7. };
8. var Fish = function(name,age){
9. Name.call(this,name);
10. this.age = age;
11. };
12. Fish.prototype = new Name();
13. Fish.prototype.constructor = Fish;
14. Fish.prototype.showInfo = function(){
15. alert(this.age);
16. }
17. var ioldFish = new Fish("老鱼",27);
18. ioldFish.getName();
19. </script>

上述子类Fish中并没定义getName方法,但是子类Fish的实例对象ioldFish依然调用到了该方法,这是因为子类Fish继承了超类 Name中定义的getName方法。解释一下,这里子类Fish的prototype指到了超类的一个实例,在子类Fish中虽然没有申明 getName方法,但是根据原型链原理,会向prototype指向的上一级对象中去查找是否有该方法,如果没找到该方法,会一直搜索到最初的原型对象。这其实也就是继承的原理了。这里特别说明一下,Fish.prototype.constructor = Fish;这句,由于默认子类的prototype应该是指向本身的,但是之前把prototype指向到了超类的实例对象,所以在这里要把它设置回来。当然这里可以把相关代码通过一个函数来组织起来,起到伪装extend的作用,这里不再阐述,可以关注本人下篇博文……

B.原型继承,从内存性能上看优于类式继承。

1. <script type="text/javascript">
2. function clone(object){
3. var F = function(){};
4. F.prototype = object;
5. return new F();
6. };
7. var Name = {
8. name:"who's name",
9. showInfo:function(){
10. alert(this.name);
11. }
12. };
13. var Fish = clone(Name);
14. //Fish.name = "老鱼";
15. Fish.showInfo();
16. </script>

很明显,原型继承核心就是这个clone函数,同样是原型链的原理,不同的是它直接克隆超类,这样的话子类就继承了超类的所有属性和方法.特别说一下,这类继承并不需要创建构造函数,只需要创建一个对象字变量,定义相应的属性和方法,然后在子类中只需要通过圆点”.”符号来引用属性和方法就可以了.

C.掺元类:把一些常用通用性比较大的方法统一封装在一个函数中,然后通过下面这个函数分派给要用到这些方法的类.还可以针对不同的类,选择性的传递需要的方法。

1. <script type="text/javascript">
2. function agument(receveClass,giveClass){
3. if(arguments[2]){
4. var len = arguments.length;
5. for(i=2;i<len;i++){
6. receveClass.prototype[arguments[i]] = giveClass.prototype[arguments[i]];
7. }
8. }
9. else{
10. for(method in giveClass.prototype){
11. if(!receveClass.prototype[method]){
12. receveClass.prototype[method] = giveClass.prototype[method];
13. }
14. }
15. }
16. };
17. var Name = function(){};
18. Name.prototype ={
19. sayLike:function(){
20. alert("i like oldfish");
21. },
22. sayLove:function(){
23. alert("i love oldfish");
24. }
25. }
26. var Fish = function(){};
27. var ioldFish = new Fish();
28. agument(Fish,Name,"sayLove");
29. ioldFish.sayLove();
30. ioldFish.sayLike();
31. </script>

多态:个人觉得这个比较抽象,很难言传,所以下面就从重载和覆盖两个方面来简单阐述一下。

重载:上面这个例子中agument函数初始带了两个参数,但是在后面的调用中,agument(Fish,Name,”sayLove”)同样可以带入任意多个参数,javascript的重载,是在函数中由用户自己通过操作 arguments这个属性来实现的。

覆盖:这个很简单,就是子类中定义的方法如果与从超类中继承过来的的方法同名,就覆盖这个方法(这里并不是覆盖超类中的方法,注意一下),这里就不累赘了!

相信如果能看明白的话,您就可以靠这些知识点,去写一个简单的脚本框架了,多多实践,相信不久的将来就能高手进级了!如果没看明白,也不用着急,面向对象本来就有些抽象,多练习练习,应该OK的了,加油……

浅谈JavaScript面向对象编程(转自酷勤网)相关推荐

  1. 浅谈JavaScript 面向对象编程[转]

    这周心血来潮,翻看了现在比较流行的几个 JS 脚本框架的底层代码,虽然是走马观花,但也受益良多,感叹先人们的伟大-- 感叹是为了缓解严肃的气氛并引出今天要讲的话题,"javascript 面 ...

  2. 浅谈PHP面向对象编程(二)

    和一些面向对象的语言有所不同,PHP并不是一种纯面向对象的语言,包PIP它支持面向对象的程序设计,并可以用于开发大型的商业程序.因此学好面向对象输程对PHP程序员来说也是至关重要的.本章并针对面向对象 ...

  3. 浅谈javascript面向对象理解

    1.面向对象与面向编程的比较 1.1 面向对象(oop) 面向对象是把事物分解称为一个个对象,然后由对象之间分工与合作,是以对象功能划分问题,而不是步骤 特征: 封装性.继承性.多态性 优点: 优点: ...

  4. 浅谈PHP面向对象编程(二、基础知识)

    和一些面向对象的语言有所不同,PHP并不是一种纯面向对象的语言,包PIP它支持面向对象的程序设计,并可以用于开发大型的商业程序.因此学好面向对象输程对PHP程序员来说也是至关重要的.本章并针对面向对象 ...

  5. 浅谈PHP面向对象编程(九)

    9.0 设计模式 在编写程序时经常会遇到一此典型的问题或需要完成某种特定需求,设计模式就是针对这些问题和需求,在大量的实践中总结和理论化之后优选的代码结构编程风格,以及解决问题的思考方式. 设计模式就 ...

  6. php面向对象静态常量,浅谈PHP面向对象编程(四、类常量和静态成员)

    4.0 类常量和静态成员 通过上几篇博客我们了解到,类在实例化对象时,该对象中的成员只被当前对象所有.如果希望在类中定义的成员被所有实例共享. 此时可以使用类常量或静态成员来实现,接下来将针对类常量和 ...

  7. 浅谈 JavaScript 编程语言的编码规范--转载

    原文:http://www.ibm.com/developerworks/cn/web/1008_wangdd_jscodingrule/ 对于熟悉 C/C++ 或 Java 语言的工程师来说,Jav ...

  8. JavaScript 中的 require / exports、import / export、浅谈JavaScript、ES5、ES6

    Node.js 的基础教学 之 exports 和 module.exports:https://zhuanlan.zhihu.com/p/82057593 浅谈 JavaScript.ES5.ES6 ...

  9. JavaScript 面向对象编程(三) —— 函数进阶 / 严格模式 / 高阶函数 / 闭包 / 浅拷贝和深拷贝

    本篇为 JavaScript 进阶 ES6 系列笔记第三篇,将陆续更新后续内容.参考:JavaScript 进阶面向对象 ES6 :ECMAScript 6 入门 系列笔记: JavaScript 面 ...

  10. 在JavaScript面向对象编程中使用继承(5)

    明天就要回老家去过年了,关于这个"在JavaScript面向对象编程中使用继承"的话题居然还没有说完.如果不完成,留下来一拖就拖到明年去了.所以还是抽空把它写完,今年的事情今年做, ...

最新文章

  1. 大话存储pdf 百度网盘_学用系列亲身体验百度网盘内测在线文档,有遗憾也有期待...
  2. IPv6 auto config 原理详解之-----前缀公告
  3. reactor模式:多线程的reactor模式
  4. 《解密小米之互联网下的商业奇迹》
  5. Eclipse项目左上角出现大红色感叹号怎么办?
  6. git分支创建与合并
  7. 数据挖掘中的KNN算法实现论文
  8. Nero Burning ROM 2014 16.0.03000 精简安装版(功能最强大的光盘刻录软件)
  9. 企业微信怎么填写服务器,勤哲Excel服务器软件做企业微信管理系统
  10. 【方向盘】2021年JVM生态报告:Java 11使用率超Java 8
  11. 超好用的内网穿透工具【永久免费不限制流量】
  12. 如何把PDF转成护眼模式/反色/黑底白字
  13. python爬取appstore的评论数据的步骤_评论抓取:Python爬取微信在APPStore上的评论内容及星级...
  14. Activiti Designer申请请假流程
  15. 电脑端如何多开微信 如何用命令行打开程序(将快捷方式复制到C:\Windows\System32目录下)
  16. 蓝牙第一章:概述、无线技术协议和基带协议
  17. 电脑桌面宠物-开机自启
  18. 创业粉去哪里引流?如何精准引流创业粉?创业粉的引流技巧
  19. [Vue.js 1] 入门基础知识与开发
  20. Yii学习(1)----使用方法

热门文章

  1. 阿里天池--宫颈癌检测(基于fastRCNN)新手初次尝试
  2. 用 regedit 命令把注册表 .reg 文件导入注册表- -
  3. python获取四六级成绩单
  4. 01 初识微信小程序
  5. 阿里文学 php,唐家三少质问阿里文学:骂我可以忍为何辱我亡妻
  6. 七脉轮位置_[转载]地球的七大脉轮位置
  7. 中国大学排名是怎样的?
  8. There are unfinished transactions remaining解决办法
  9. facebook 登陆失败 分享失败 原因汇总
  10. vue.js环境+腾讯防水墙+实现弹窗滑动模块验证登录