【20190220】JavaScript-知识点整理:对象创建方式、原型、闭包
一、对象创建方式
1. 工厂模式
这种模式抽象了创建具体对象的过程,用函数来封装以特定接口创建对象的细节。存在的问题是无法通过 instanceof 识别一个对象的类型。
function createPerson(name,age,job){
var o=new object();
o.name=name;
o.age=age;
o.job=job;
o.sayName=function(){
alert(this.name);
}
return o;
}
var person=createPerson("Greg","27","Doctor");
2. 构造函数模式
创建自定义的构造函数,从而定义自定义对象类型的属性和方法。利用构造函数模式创建实例对象时,必须使用new操作符,并可以通过 instanceof 检测到对象的自定义类型。
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.sayName=function(){
alert(this.name);
}
}
var person=new Person("Greg","27","Doctor");//1.创建一个新对象;2.将构造函数的作用域赋给新对象(this指向新对象);3.执行构造函数中的代码;4.返回新对象
此时存在的问题是自定义对象中定义的方法都要在每个实例上重新创建一遍,也就是说不同实例上的同名函数是不相等的。虽然可以通过将函数定义转移到构造函数外来解决,这时每个实例中的函数引用的都是在全局作用域中定义的一个全局函数。但是这又带来了新的问题,就是当对象需要定义很多方法时,就需要定义很多个全局函数。
3. 原型模式
我们创建的每个函数都有一个prototype(原型)属性,它是一个指针,指向一个对象,即原型对象,原型对象可以让所有对象实例共享它所包含的属性和方法。存在的问题是所有实例在默认情况下都将取得相同的属性值。
function Person(){
}
Person.prototype={
constructor:Person,//这里实际上是重写了Person的原型对象,因此其constructor指向的是Object构造函数,此时通过instanceof能识别到特定类型,但其constructor已经无法确定对象类型了,因此可以重新将它设置回适当的值。
name:"Nicholas",
age:29,
job:"Doctor",
sayName:function(){
alert(this.name);
}
};
var person=new Person();
4. 组合使用构造函数模式和原型模式
这是创建自定义类型的最常见方法,构造函数模式用于定义实例属性,原型模式用于定义方法和共享的属性。
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
this.friends=["Shelby","Court"];
}
Person.prototype={
constructor:Person,
sayName:function(){
alert(this.name);
}
}
var person=new Person("Greg",27,"Doctor");
5. 动态原型模式
把所有信息都封装在构造函数中,通过在构造函数中初始化原型,保持了同时使用构造函数和原型的优点。也就是说可以通过检查某个应该存在的方法是否有效,来决定是否需要初始化原型。这时不能用对象字面量重写原型,如果在以及创建了实例的情况下重写原型,会切断现有实例与新原型之间的联系。
function Person(name,age,job){
this.name=name;
this.age=age;
this.job=job;
if(typeof this.sayName != "function"){
Person.prototype.sayName=function(){
alert(this.name);
}
}
}
var person=new Person("Greg","27","Doctor");
6. 寄生构造函数模式
这种模式除了使用new操作符创建实例对象并把使用的包装函数称作构造函数之外,与工厂模式是一样的。这个模式可以在特殊情况下用来为对象创建构造函数,如想创建一个具有额外方法的特殊数组。但需要注意的是返回的对象与构造函数以及构造函数的原型属性之间没有关系,因此不能通过instanceof识别对象类型。建议在可以使用其他模式的情况下不要使用这种模式。
7. 稳妥构造函数模式
稳妥对象指的是没有公共属性,而且其方法也不引用this的对象,它适合在一些安全的环境中(这些环境中会禁止使用this和new),或者在防止数据被其他应用程序改动时使用。稳妥构造函数与寄生构造函数有类似的模式,但有两点不同:一是新创建对象的实例方法不引用this;二是不使用new操作符调用构造函数。
二、闭包
闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见方式就是在一个函数内部创建另一个函数,应用的两种情况是:一是函数作为返回值;二是函数作为参数传递。
由于在另一个函数内部定义的函数会将外部函数的活动对象添加到它的作用域链中,因此即使当外部函数返回后,其执行环境的作用域链会被销毁,但它的活动对象仍然留在内存中,因为在其内部定义的函数仍然在引用它。
直到内部函数被销毁后,外部函数的活动对象才会被销毁。所以使用闭包会增加内存开销。
【20190220】JavaScript-知识点整理:对象创建方式、原型、闭包的更多相关文章
- javascript一种新的对象创建方式-Object.create()
1.Object.create() 是什么? Object.create(proto [, propertiesObject ]) 是E5中提出的一种新的对象创建方式,第一个参数是要继承的原型,如果不 ...
- 第163天:js面向对象-对象创建方式总结
面向对象-对象创建方式总结 1. 创建对象的方式,json方式 推荐使用的场合: 作为函数的参数,临时只用一次的场景.比如设置函数原型对象. var obj = {}; //对象有自己的 属性 和 行 ...
- javascript中的对象创建与继承
js是一门基于原型的面向对象语言,与传统的面向对象如Java,C#相比,它在对象创建及继承上有自己独特的实现方式,本文主要描述js中对象创建及继承的一些实践. 1.对象创建 方式一:工厂模式创建对象 ...
- JavaScript—对象创建方式
JavaScript 也是面向对象的语言(oop) 之前学JavaScript 没有学对象.现在做下笔记 创建对象的方式: 1. 对象字面量 const hero = { name: '吕布', w ...
- JavaScript知识点整理(一)
JavaScript知识点(一)包括 数据类型.表达式和运算符.语句.对象.数组. 一.数据类型 1) js中6种数据类型:弱类型特性 5种原始类型:number(数字).string(字符串).bo ...
- 《你不知道的JavaScript》整理(四)——原型
一.[[Prototype]] JavaScript中的对象有一个特殊的[[Prototype]]内置属性,其实就是对于其他对象的引用. var myObject = { a: 2 }; myObje ...
- JavaScript知识点整理
1.JavaScript的定义 JavaScript是一种专门为与网页交互而设计的脚本语言.有下列三部分组成 ①ECMAScript,提供核心语言功能 ②文档对象模型(DOM),提供访问与操作网页内容 ...
- 【JavaScript回顾】对象创建的几种模式
组合使用构造函数模式和原型模式 创建自定义类型的常见方式,就是组合使用构造函数模式与原型模式.构造函数模式用于定义实 例属性,而原型模式用于定义方法和共享的属性.结果,每个实例都会有自己的一份实例属性 ...
- javascript ActiveXObject FileSystemObject 对象,创建、复制、删除、读取文件等
Javascript是网页制作中离不开的脚本语言,依靠它,一个网页的内容才生动活泼.富有朝气.但也许你还没有发现并应用它的一些更高级的功能吧?比如,对文件和文件夹进行读.写和删除,就象在VB.VC等高 ...
随机推荐
- Oracle实战笔记(第一天)
导读 笔记内容来自韩顺平老师的视频<玩转Oracle实战教程>,可以结合笔记进行观看.第一天视频中还有Oracle的介绍和安装等内容,很容易搜索到,这里就不再进行总结. 目录 1.命令行工 ...
- Rpc框架dubbo-server(v2.6.3) 源码阅读(一)
额,dubbo的前世今生咱就不说了,有用的人都知道.(最新版本已更名 incubator-dubbo,预计版本3.0,不过咱们就先不掺和别人的开发过程了,以v2.6.3为蓝本) 首先,是工作需要,用到 ...
- MySQL数据库的锁机制
在并发访问情况下,很有可能出现不可重复读等等读现象.为了更好的应对高并发,封锁.时间戳.乐观并发控制(乐观锁).悲观并发控制(悲观锁)都是并发控制采用的主要技术方式. 锁分类 ①.按操作划分:DML锁 ...
- java IO流之详细总结
什么是io流? 分为两种: 输入流:可以从文件中读取到程序,从源数据源读取到程序,叫做输入流. 输出流:可以从程序中读取到文件,从程序写,使用输出流,写入到文件中.叫做输出流. 使用File操作文件或 ...
- DedeCMS上传视频
DedeCMS建站方便快捷,但是在上传视频时会出现问题,主要是文件格式与大小限制,需要修改配置文件,修改的地方主要有: 1.修改 DedeCMS系统配置参数--附件设置--允许的多媒体软件类型(以MP ...
- base64文件转MultipartFile文件
在一些项目中,上传图片或者文件过大,这个时候我们就要选择压缩文件,压缩到我们指定的范围内在上传到服务器,当然压缩也是可以放到服务器进行操作的,但是考虑到前端传输时间问题,所以我们一般都是放到前端压缩后 ...
- Java核心技术及面试指南 数据库方面的面试题归纳以及总结
5.1.7.1 事务的四大特性是什么? ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚. ⑵ 一致性(Consistency) 一致性是指事务必须使数据库 ...
- ASP.NET Core 如何在运行Docker容器时指定容器外部端口(docker compose)
前面我写了一系列关于持续集成的文章,最终构建出来的镜像运行之后,应该会发现每次构建运行之后端口都变了,这对于我们来说是十分不方便的,所以我们可以通过修改docker compose的配置文件来完成我们 ...
- 剑指offer例题分享--6
前言:继续整理例题,快速做完这部分,然后继续用C++去刷数据结构和算法的题. 面试题28: 代码如下: #include<iostream> #include<stdio.h> ...
- 使用docker搭建数据分析环境
注:早在学习<云计算>这门课之前就已经知道docker,学习这门课时老师还鼓励我们自己尝试一下:但是直到去年年底才有机会尝试,用过之后感觉确实很好用.最近需要部署几个shiny应用,又回顾 ...