javascript中创建对象的方式及优缺点(二)
一、工厂模式
- 流程: 定义一个函数,函数返回对象。
- 适用场景: 需要创建多个对象,都是
Object
类型。 - 优点:完成了返回一个对象的要求。
- 缺点: 对象没有一个具体的类型,无法通过
constructor
识别对象, 都是Object
类型。多个实例的sayName
方法都是实现一样的效果,但是却存储了很多次。
// 1.工厂模式
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 p1 = createPerson('Tom', 12, 'student')
var p2 = createPerson('Mandy', 22, 'teacher') // 或者:
function createPerson (name, age, job) { // 返回一个对象的函数==》工厂函数
// 显式的创建对象
var o = {
name:name,
age:age,
job:job,
sayName: function () {
alert(this.name)
}
}
return o // 返回对象
}
var p1 = createPerson('Tom', 12, 'student')
var p2 = createPerson('Mandy', 22, 'teacher'
二、.构造函数模式
- 流程:创建一个构造函数,没有显式地创建对象,没有
return
语句,通过new
操作符创建对象。 - 使用场景:需要创建多个类型确定的对象。
- 优点:可以通过
constructor
或者instanceof
来识别对象实例的类型。 - 缺点:多个实例的
sayName
方法都是实现一样的效果,但是却存储了很多次(两个对象实例的sayName
方法是不同的,因为存放的地址不同)。
function Person (name, age) {
this.name = name
this.age = age
this.sayName = function () {
alert(this.name)
}
}
var p1 = new Person('Tony', 14)
var p2 = new Person('Bob', 15
三、原型模式
- 流程:创建一个构造函数,给这个函数的
prototype
添加属性和方法。通过new操作符创建对象。 - 使用场景:起始时对象内部数据是确定的。
- 优点:(1)
sayName
方法是共享的,所有实例的sayName
方法都指向同一个。(2)可以动态的添加原型对象的方法和属性,并直接反映在对象实例上。 - 缺点:(1)由于
p1
和p2
的name
属性指向同一块内存区域,因此改变p1.name
会导致p2.name
改变。(2)所有的方法都是共享的,没有办法创建自己的属性和方法,也没有办法像构造函数哪像传递参数。
function Person () {}
Person.prototype.name = 'Mandy'
Person.prototype.age = 16
Person.prototype.sayName = function () {
alert(this.name)
}
var p1 = new Person()
var p2 = new Person()
p1.sayName() // "Mandy"
四、构造函数+原型组合模式
- 流程:自定义构造函数,属性在函数中初始化,方法添加到原型上。
- 适用场景:需要创建多个类型确定的对象。
- 优点:(1)解决了原型模式对于对象引用的问题。(2)解决了原型模式没有办法传递参数的问题。(3)解决了构造函数模式不能共享方法的问题。
function Person (name) {
this.name = name
}
Person.prototype.sayName = function () {
console.log(this.name)
}
var p1 = new Person('Mandy')
p1.sayName() // Mandy
五、动态原型模式
- 流程:创建构造函数,在构造函数内部初始化属性,在构造函数内部在原型上添加方法。通过
new
操作符创建对象。 - 需要创建多个类型确定的对象。
- 优点:(1)可以在初次调用构造函数的时候就完成原型对象的修改。(2)对原型对象的修改能在所有的实例中反映。
- 缺点:红宝书上说了这个方案非常完美。
function Person(name, age) {
// 属性
this.name = name
this.age = age
// 方法
// 判断sayName方法不存在的情况下,在原型上添加sayName方法。
if(typeof this.sayName != 'function') {
Person.prototype.sayName = function () {
console.log(this.name)
}
}
}
var p1 = new Person('Tom')
p1.sayName() // "Tom
六、寄生构造模式
- 流程:创建一个构造函数,在这个函数内部创建一个对象,用
return
返回对象。通过new
操作符创建。 - 除了使用
new
操作符并把使用的包装函数叫做构造函数以外,这个模式与工程模式其实是一模一样的。
function Person(name, age) { // 将创建对象的代码封装在函数中。
// 显式创建要返回的对象
var o = new Object()
o.name = name
o.age = age
o.sayName = function () {
console.log(this.name)
}
return o // 返回对象
}
var p1 = new Person('Mandy',18)
七、稳妥构造模式
- 优点:安全。除了调用
sayName
方法外,没有其他办法可以访问name
的值。
function Person (name, age) {
// 创建要返回的对象
var o = new Object()
// 添加方法
o.sayName = function () {
console.log(this.name)
}
// 返回对象
return o
}
var p1 = new Person('Mandy',20)
p1.name // undefined
// 除了调用sayName方法外,没有其他办法可以访问name的值。
p1.sayName() // "Mandy"
javascript中创建对象的方式及优缺点(二)的更多相关文章
- javascript中创建对象的方式及优缺点(一)
1. 简单方式创建对象 // 字面量方式创建对象 var person1 = { name: "xyc", age: 23, sayHi: function() { console ...
- javascript中创建对象的方式总结
javascript中创建对象的方式总结 具体代码如下: //创建对象的方式: //创建方式一 var person=new Object(); person.name='jack'; person. ...
- javascript中各种继承方式的优缺点
javascript中实现继承的方式有很多种,一般都是通过原型链和构造函数来实现.下面对各种实现方式进行分析,总结各自的优缺点. 一 原型继承 let Super = functioin(name = ...
- JavaScript中创建对象的三种方式!
JavaScript中创建对象的三种方式! 第一种 利用对象字面量! // 创建对象的三种方式! // 1 对象字面量. var obj = { // 对象的属性和方法! name: 'lvhang' ...
- 深入理解JavaScript中创建对象模式的演变(原型)
深入理解JavaScript中创建对象模式的演变(原型) 创建对象的模式多种多样,但是各种模式又有怎样的利弊呢?有没有一种最为完美的模式呢?下面我将就以下几个方面来分析创建对象的几种模式: Objec ...
- javascript中创建对象的几种不同方法
javascript中创建对象的几种不同方法 方法一:最直白的方式:字面量模式创建 <script> var person={ name:"小明", age:20, s ...
- javascript 中继承实现方式归纳
转载自:http://sentsin.com/web/1109.html 不同于基于类的编程语言,如 C++ 和 Java,javascript 中的继承方式是基于原型的.同时由于 javascrip ...
- javascript中创建对象和实现继承
# oo ##创建对象 1. 原型.构造函数.实例之间的关系 * 原型的construct->构造函数:调用isPrototypeOf(obj)方法可以判定和实例的关系: * 构造函数的pro ...
- JavaScript中你所不知道的Object(二)--Function篇
上一篇(JavaScript中你所不知道的Object(一))说到,Object对象有大量的内部属性,而其中多数和外部属性的操作有关.最后留了个悬念,就是Boolean.Date.Number.Str ...
随机推荐
- 纯前端表格控件SpreadJS以专注业务、提升效率赢得用户与市场
提起华为2012实验室,你可能有点陌生. 但你一定还对前段时间华为的那封<海思总裁致员工的一封信>记忆犹新,就在那篇饱含深情的信中,我们知道了华为为确保公司大部分产品的战略安全和连续供应, ...
- Java基础(九)
综合案例 此前我们已经练习了根据集合当中的字符串对象读写文件,而本综合案例主要练习根据集合当中的自定义对象来读写文件. 场景介绍 很多网络游戏当中都有组队模式,例如魔兽世界.DotA.英雄联盟(LOL ...
- js中‘0’到底是 true 还是 false
if ('0') alert("'0' is true"); if ('0' == false) alert("'0' is false");结果是,两次都 ...
- 2019中山纪念中学夏令营-Day4[JZOJ]
Begin (题目的排序方式:难易程度) 什么是对拍: 对拍是一种在写完程序后,验证自己程序是不是正解的比较方便的方法. 实现过程: 对同一道题,再打一个暴力程序,然后用一些大数据等跑暴力程序来进行验 ...
- 集成学习-Boosting 模型深度串讲
首先强调一下,这篇文章适合有很好的基础的人 梯度下降 这里不系统讲,只介绍相关的点,便于理解后文 先放一个很早以前写的 梯度下降 实现 logistic regression 的代码 def tidu ...
- Java小程序—录屏小程序(下半场)
下半场. 上半场,我们我们写了录屏的程序,那么下半场我们的任务是写一个播放器. 设计思路:播放器的思路就是将图片放在一个JScrollPane中顺序播放,所以还是得使用swing组件,并且仍然要使用线 ...
- VMware Ubuntu18.04 安装及配置笔记
安装Ubuntu 下载虚拟机VMware 下载镜像Ubuntu 过程略, 参考 https://zhuanlan.zhihu.com/p/38797088 Ubuntu配置 特别提示: 在Ubuntu ...
- python网络爬虫(9)构建基础爬虫思路
目的意义 基础爬虫分5个模块,使用多个文件相互配合,实现一个相对完善的数据爬取方案,便于以后更完善的爬虫做准备. 这里目的是爬取200条百度百科信息,并生成一个html文件,存储爬取的站点,词条,解释 ...
- Django框架——基础之路由系统(urls.py)11111111
1.URL路由系统前言 URL是Web服务的入口,用户通过浏览器发送过来的任何请求,都是发送到一个指定的URL地址,然后被响应. 在Django项目中编写路由,就是向外暴露我们接收哪些URL的请求,除 ...
- 浙大数据结构课后习题 练习二 7-3 Pop Sequence (25 分)
Given a stack which can keep M numbers at most. Push N numbers in the order of 1, 2, 3, ..., N and p ...