ECMAScript 有两种开发模式:1.函数式(过程化),2.面向对象(OOP)。面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象。但是,ECMAScript 没有类的概念,因此它的对象也与基于类的语言中的对象有所不同。

js本身是没有class类型的,但是每个函数都有一个prototype属性。prototype指向一个对象,当函数作为构造函数时,prototype则起到类似class的作用。

var box = new Object(); //创建一个Object 对象
box.name = 'Lee'; //创建一个name 属性并赋值
box.age = 100; //创建一个age 属性并赋值
box.run = function () { //创建一个run()方法并返回值
return this.name + this.age + '运行中...';
};
alert(box.run()); //输出属性和方法的值

上面创建了一个对象,并且创建属性和方法,并且实例化该对象,最后调用对象的方法。在run()方法里的this,就是代表box 对象本身。但是有个缺点就是不能实例化多个具有相似属性和方法的对象。于是我们想到了可不可以有一套模板来批量制作对象。于是就有了-工厂模式。看下面例子

function createObject(name, age) { //集中实例化的函数
var obj = new Object();
obj.name = name;
obj.age = age;
obj.run = function () {
return this.name + this.age + '运行中...';
};
return obj;
}
var box1 = createObject('Lee', 100); //第一个实例
var box2 = createObject('Jack', 200); //第二个实例
alert(box1.run());
alert(box2.run()); //保持独立

这种方法虽然制造出来了一套模板来规范待实例化的对象。但是还有许多问题,比如创建不同对象其中属性和方法都会重复建立,消耗内存,还有函数识别问题等等。其实还有更优秀的也是用的最多的方法,看下面示例。

function Box(name, age) { //构造函数模式
this.name = name;
this.age = age;
this.run = function () {
return this.name + this.age + '运行中...';
};
}
var box1 = new Box('Lee', 100); //new Box()即可
var box2 = new Box('Jack', 200);
alert(box1.run());
alert(box1 instanceof Box); //很清晰的识别他从属于Box

这个方法看似像一个函数,但又有些不太一样。比如函数名一般都小写。如果学过其他面向对象的语言就会知道,这是类的写法(此处不多分析,非强制,但这么写有助于区分构造函数和
普通函数)。这种方法是构造函数创建对象的写法,通过构造函数创建对象,必须使用new 运算符。

构造函数可以创建对象执行的过程:

1)当使用了构造函数,并且new 构造函数(),那么就后台执行了new Object();
2)将构造函数的作用域给新对象,(即new Object()创建出的对象),而函数体内的this 就
代表new Object()出来的对象。
3)执行构造函数内的代码;
4)返回新对象(后台直接返回)。

注:

1)构造函数和普通函数的唯一区别,就是他们调用的方式不同。只不过,构造函数也是函数,必须用new 运算符来调用,否则就是普通函数。

2)this就是代表当前作用域对象的引用。如果在全局范围this 就代表window 对象,如果在构造函数体内,就代表当前的构造函数所声明的对象。

这种方法解决了函数识别问题,但消耗内存问题没有解决。同时又带来了一个新的问题,全局中的this 在对象调用的时候是Box 本身,而当作普通函数调用的时候,this 又代表window。即this作用域的问题。

转载于:https://www.cnblogs.com/coolzone/p/6589090.html

js里的面向对象分析-(创建实例化对象)相关推荐

  1. Spring AOP 源码分析 - 创建代理对象

    1.简介 在上一篇文章中,我分析了 Spring 是如何为目标 bean 筛选合适的通知器的.现在通知器选好了,接下来就要通过代理的方式将通知器(Advisor)所持有的通知(Advice)织入到 b ...

  2. php 对象里还有哪些对象_PHP面向对象(OOP)之实例化对象的方法

    点击蓝字关注我们!每天获取最新的编程小知识! 源 / php中文网      源 / www.php.cn 面向对象程序的单位就是对象,但对象又是通过类的实例化出来的,既然我们类会声明了,下一步就是实 ...

  3. 【Android Protobuf 序列化】Protobuf 使用 ( Protobuf 源码分析 | 创建 Protobuf 对象 )

    文章目录 一.Protobuf 源码分析 二.创建 Protobuf 对象 三.完整代码示例 四.参考资料 一.Protobuf 源码分析 Protobuf 源文件如下 : addressbook.p ...

  4. Unity 创建/实例化对象

    在程序运行过程中创建.实例化对象物体需要用到Object类中的 Instantiate 函数,例如,我们场景中有一个物体A: 现在我们想要在场景中创建五个该物体,则用Instantiate函数将该物体 ...

  5. SQL Server2016安装以及出现的问题(安装程序无法与服务器取得联系,DQS安装失败未能创建实例化对象等)解决办法

    1:前面的几步应该肯定是没有问题的啦(如果是"天选之子"那可就说不定了)不过前面几部都是直接闭着眼点击下一步就行.完成–>点击下一步 2:默认选择就好,继续点击下一步. 3: ...

  6. Spring IOC 容器源码分析 - 创建原始 bean 对象

    1. 简介 本篇文章是上一篇文章(创建单例 bean 的过程)的延续.在上一篇文章中,我们从战略层面上领略了doCreateBean方法的全过程.本篇文章,我们就从战术的层面上,详细分析doCreat ...

  7. Spring IOC 容器源码分析 - 创建单例 bean 的过程

    1. 简介 在上一篇文章中,我比较详细的分析了获取 bean 的方法,也就是getBean(String)的实现逻辑.对于已实例化好的单例 bean,getBean(String) 方法并不会再一次去 ...

  8. iOS培训objective-c——实例化对象

    蓝鸥iOS培训推荐:好像好长时间没和大家分享了,那么今天主要和大家说说OC内容创建实例化对象,基本让也就分为几大类: 1.ClassName*myNewClassName;//指针 2.myNewCl ...

  9. JS面向对象,创建,继承

    很开心,最近收获了很多知识,而且发现很多东西,以前理解的都是错的,或者是肤浅的,还以为自己真的就get到了精髓,也很抱歉会影响一些人往错误的道路上走,不过这也告诉了我们,看任何一篇文章都不能盲目的去相 ...

最新文章

  1. Visual Studio 20年
  2. Length High
  3. pymysql.err.IntegrityError: (1062, Duplicate entry 'roxml-ROXML' for key 'PRIMARY')
  4. 计算机数学专业是应用数学专业吗,大学数学系的数学与应用数学专业学什么课程内容?...
  5. 金三银四我带你去BAT面试现场,干货整理
  6. python scrapy框架爬虫当当图书网
  7. Bailian2753 菲波那契数列(POJ NOI0202-1755)【数列+记忆化递归】
  8. python数据科学库_Python数据科学库
  9. 硬盘读写测试工具_买了固态硬盘不知好坏?这些测试工具帮你大忙
  10. android界面设计中用的字体,APP界面设计必备!最全UI设计字体规范
  11. matlab/simulink通...,详解MATLAB Simulink通信系统建模与仿真
  12. 科大学长对数学系学弟学妹的忠告
  13. 2018校招笔试真题汇总 精
  14. 阿里云大数据开发一面面经,已过,面试题已配答案
  15. PS照片美化处理实例教程
  16. 上海某大型企业因盗版Catia被罚千万
  17. torchvision的使用(transforms用法介绍)
  18. springmvc500错误
  19. Python中用户界面设计(GUI)
  20. java关键字的用法_JAVA总结(一)-----关键字分类及使用

热门文章

  1. 互联网大佬学历背景大揭秘,看看是你的老乡还是校友
  2. 常用的HTML标签(超文本标记语言)
  3. 从零开始学习springBoot2
  4. 微信小程序 body属性的问题
  5. jdbc建立数据库连接的helloword
  6. 从网络字节流中提出整数
  7. 【C#】【引用加原创】C#实现kalman滤波
  8. CRM软件设计评测点与采集测评点
  9. php跳转分站,PHP判断IP并转跳到相应城市分站的方法
  10. 单片机shell命令_MCU调试大法:使用串口实现简单shell功能