javascript如何才能脱离函数式编程,拥抱面向对象编程呢,常见的有3种形式,其它形式可以说都是这3种的变种。
 
1.直接定义对象直接量的形式
 
var Util={
    getType:function(obj){
    return Object.prototype.toString.call(obj).replace(/^\[object (.+)\]$/, '$1').toLowerCase();
    }
}
这种是最简单的封装形式,不需要用到原型,也不需要构造器函数,当你只需要一个对象实例的时候,例如一个工具类
调用形式也不需要使用new,直接的Util.getType(obj);
 
 
2.构造器函数this绑定对象形式
 
var User=function (){
    this.userName="windy";
    this.eat=function(){
      console.log("i'm eatting");
   } 
    this.sleep=function(){
      console.log("i'm sleeping")
   }
}
这种定义方式不需要用到对象原型,调用的时候需要用到new 操作符,var user=new User();
需要特别注意的是this的指向问题,this并不是指向User构造器函数的,在调用new User()时生成了一个空对象,
先不考虑原型,简单的理解相当于调用了var obj={}; User.apply(obj,arguments);
这种方式每次调用一次new ,都会把通过this.定义的属性和函数全部拷贝一次,虽然对于function来说只是拷贝了引用,只多占了少许内存,但对于像jquery这种有成百上千个实例,方法数量又很多的情况下浪费就比较大了。
 
因此最优的形式是第3种,原型的方式定义
 
3.构造器函数原型对象定义形式
var User=function (){
    this.userName="windy";
    User.prototype.eat=function(){
      console.log("i'm eatting");
   } 
    User.prototype.sleep=function(){
      console.log("i'm sleeping")
   }
}

原则上是将属性定义在新生成的对象上,将函数定义在原型上,私有变量用var声明,这样新生成的对象就只包含属性,方法都通过原型链引用,不会污染当前对象。不过像上面这段代码这样定义,一旦需要改类(对象)的名字很麻烦,每个方法都要硬编码User对象,好多重复啊,

 
改进后:
var User=function (){
    this.userName="windy";
    User.prototype={
      constructor:User,
     eat:function(){
      console.log("i'm eatting");
   } ,
     sleep:function(){
      console.log("i'm sleeping")
   }
    }
}
 
直接给prototype赋值会造成construcor丢失,因为construtor是取原型上的该属性的,如果直接覆盖原型就没这个引用了,所以要单独再赋值回来,当然如果你要不需要用到constructor的话不赋值也没关系。
 
但还是出现了两个User的硬编码,再进一步可以用var FN=arguments.callee;  FN.prototype={......}
 
 
总结:2和3两种形式都会返回一个自动创建的新对象,不同的是前者是将方法都定义在了新对象上,而后者并没有把方法定义在新对象上,而是对构造器函数的原型开刀,定义在原型上,生成的新对象虽然啥都没有,但是通过__proto__原型链访问到构造函数的原型就拥有了一切。
 
另外,在构造器函数中是会自动return 新对象的,但是如果手动定一个return ,则会返回手工定义的对象,这个手工定义的对象原型也是赋值为该构造器函数,如果return的是原始值类型(string,number,boolean),则这个return 会被无视。
 

javascript面向对象编程的3种常见封装形式解析的更多相关文章

  1. 转:javascript面向对象编程

    作者: 阮一峰 日期: 2010年5月17日 学习Javascript,最难的地方是什么? 我觉得,Object(对象)最难.因为Javascript的Object模型很独特,和其他语言都不一样,初学 ...

  2. (二)Javascript面向对象编程:构造函数的继承

    Javascript面向对象编程:构造函数的继承   这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承 ...

  3. Javascript面向对象编程(二):构造函数的继承 作者:yuan一峰

    Javascript面向对象编程(二):构造函数的继承   作者: 阮一峰 日期: 2010年5月23日 这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生 ...

  4. JavaScript面向对象编程[转]

    JavaScript面向对象编程 命名空间 命名空间是一个容器,它允许开发人员在一个独特的,特定于应用程序的名称下捆绑所有的功能. 在JavaScript中,命名空间只是另一个包含方法,属性,对象的对 ...

  5. javascript 面向对象编程(工厂模式、构造函数模式、原型模式)

      javascript 面向对象编程(工厂模式.构造函数模式.原型模式) CreateTime--2018年3月29日17:09:38 Author:Marydon 一.工厂模式 /** * 工厂模 ...

  6. JavaScript 面向对象编程(二):继承

    Javascript面向对象编程(二):构造函数的继承 这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继 ...

  7. 快速学习JavaScript面向对象编程

    到处都是属性.方法,代码极其难懂,天哪,我的程序员,你究竟在做什么?仔细看看这篇指南,让我们一起写出优雅的面向对象的JavaScript代码吧! 作为一个开发者,能否写出优雅的代码对于你的职业生涯至关 ...

  8. 深入理解Javascript面向对象编程

    深入理解Javascript面向对象编程 阅读目录 一:理解构造函数原型(prototype)机制 二:理解原型域链的概念 三:理解原型继承机制 四:理解使用类继承(继承的更好的方案) 五:建议使用封 ...

  9. 【转】Javascript 面向对象编程(一):封装

    原文链接:http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html Javascript ...

随机推荐

  1. 用绿色版TOMCAT和绿色版JDK安装一个WEB服务器

    (1) 使用绿色版本JDK,解压到一个目录上D:\jdk1.6.   (2) 使用绿色版本Tomcat,解压到另一个目录上D:\jdk1.6\tomcat5.5 只要在bat文件D:\tomcat5. ...

  2. java 十大经典排序算法

    十大排序算法可以说是每个程序员都必须得掌握的了,花了一天的时间把代码实现且整理了一下,为了方便大家学习,我把它整理成一篇文章,每种算法会有简单的算法思想描述,为了方便大家理解,我还找来了动图演示:这还 ...

  3. open-source--攻防世界

    题目直接给了源码,发现只要跳过条件就可以得到flag

  4. 空中网4k/5k月薪挑选大四实习生的线程题

    空中网4k/5k月薪挑选大四实习生的线程题 两年前,我们一个大四的学员去应聘空中网的实习生职位,空中网只给他出了三道线程题,拿回家做两天后再去给经理讲解,如果前两题做好了给4k月薪,第三道题也做出来的 ...

  5. R 《回归分析与线性统计模型》page121,4.4

    rm(list = ls()) A = read.xlsx("xiti_4.xlsx",sheet = 4) names(A) = c("ord"," ...

  6. Java程序员学习Go指南(三)

    转载:https://www.luozhiyun.com/archives/213 人是否会进步以及进步得有多快,依赖的恰恰就是对自我的否定,这包括否定的深刻与否,以及否定自我的频率如何.这其实就是& ...

  7. 035、Java中自增之++在后面的写法

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  8. php 文件缓存 include vs serialize vs json_encode

    大神:http://techblog.procurios.nl/k/news/view/34972/14863/cache-a-large-array-json-serialize-or-var_ex ...

  9. vue axios的跨域前后端解决方案

    原因出于安全考虑,浏览器有一个同源策略.浏览器中,异步请求的地址与目标地址的协议.域名和端口号三者与当前有不同,就属于跨域请求. 限制跨域访问是浏览器的一个安全策略,因为如果没有这个策略,那么就有被跨 ...

  10. 记录:JAVA抽象类、接口、多态

    JAVA抽象类.接口.多态 1. 多态 定义 多态是同一个行为具有多个不同表现形式或形态的能力.(多态就是同一个接口,使用不同的实例而执行不同操作) 如何实现多态 继承和接口 父类和接口类型的变量赋值 ...