js里的面向对象分析-(创建实例化对象)
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里的面向对象分析-(创建实例化对象)相关推荐
- Spring AOP 源码分析 - 创建代理对象
1.简介 在上一篇文章中,我分析了 Spring 是如何为目标 bean 筛选合适的通知器的.现在通知器选好了,接下来就要通过代理的方式将通知器(Advisor)所持有的通知(Advice)织入到 b ...
- php 对象里还有哪些对象_PHP面向对象(OOP)之实例化对象的方法
点击蓝字关注我们!每天获取最新的编程小知识! 源 / php中文网 源 / www.php.cn 面向对象程序的单位就是对象,但对象又是通过类的实例化出来的,既然我们类会声明了,下一步就是实 ...
- 【Android Protobuf 序列化】Protobuf 使用 ( Protobuf 源码分析 | 创建 Protobuf 对象 )
文章目录 一.Protobuf 源码分析 二.创建 Protobuf 对象 三.完整代码示例 四.参考资料 一.Protobuf 源码分析 Protobuf 源文件如下 : addressbook.p ...
- Unity 创建/实例化对象
在程序运行过程中创建.实例化对象物体需要用到Object类中的 Instantiate 函数,例如,我们场景中有一个物体A: 现在我们想要在场景中创建五个该物体,则用Instantiate函数将该物体 ...
- SQL Server2016安装以及出现的问题(安装程序无法与服务器取得联系,DQS安装失败未能创建实例化对象等)解决办法
1:前面的几步应该肯定是没有问题的啦(如果是"天选之子"那可就说不定了)不过前面几部都是直接闭着眼点击下一步就行.完成–>点击下一步 2:默认选择就好,继续点击下一步. 3: ...
- Spring IOC 容器源码分析 - 创建原始 bean 对象
1. 简介 本篇文章是上一篇文章(创建单例 bean 的过程)的延续.在上一篇文章中,我们从战略层面上领略了doCreateBean方法的全过程.本篇文章,我们就从战术的层面上,详细分析doCreat ...
- Spring IOC 容器源码分析 - 创建单例 bean 的过程
1. 简介 在上一篇文章中,我比较详细的分析了获取 bean 的方法,也就是getBean(String)的实现逻辑.对于已实例化好的单例 bean,getBean(String) 方法并不会再一次去 ...
- iOS培训objective-c——实例化对象
蓝鸥iOS培训推荐:好像好长时间没和大家分享了,那么今天主要和大家说说OC内容创建实例化对象,基本让也就分为几大类: 1.ClassName*myNewClassName;//指针 2.myNewCl ...
- JS面向对象,创建,继承
很开心,最近收获了很多知识,而且发现很多东西,以前理解的都是错的,或者是肤浅的,还以为自己真的就get到了精髓,也很抱歉会影响一些人往错误的道路上走,不过这也告诉了我们,看任何一篇文章都不能盲目的去相 ...
最新文章
- Visual Studio 20年
- Length High
- pymysql.err.IntegrityError: (1062, Duplicate entry 'roxml-ROXML' for key 'PRIMARY')
- 计算机数学专业是应用数学专业吗,大学数学系的数学与应用数学专业学什么课程内容?...
- 金三银四我带你去BAT面试现场,干货整理
- python scrapy框架爬虫当当图书网
- Bailian2753 菲波那契数列(POJ NOI0202-1755)【数列+记忆化递归】
- python数据科学库_Python数据科学库
- 硬盘读写测试工具_买了固态硬盘不知好坏?这些测试工具帮你大忙
- android界面设计中用的字体,APP界面设计必备!最全UI设计字体规范
- matlab/simulink通...,详解MATLAB Simulink通信系统建模与仿真
- 科大学长对数学系学弟学妹的忠告
- 2018校招笔试真题汇总 精
- 阿里云大数据开发一面面经,已过,面试题已配答案
- PS照片美化处理实例教程
- 上海某大型企业因盗版Catia被罚千万
- torchvision的使用(transforms用法介绍)
- springmvc500错误
- Python中用户界面设计(GUI)
- java关键字的用法_JAVA总结(一)-----关键字分类及使用