文档章节

JavaScript创建对象(七)——稳妥构造函数模式

Bob2100
 Bob2100
发布于 01/01 09:48
字数 602
阅读 14
收藏 0

道格拉斯-克罗克福德发明了JavaScript中的稳妥对象这个概念。所谓稳妥对象,指的是没有公共属性,而且其方法也不引用this的对象。稳妥对象最适合在一些安全的环境中(这些环境中会禁止使用thisnew),或者在防止数据被其他应用程序(如Mashup程序)改动时使用。稳妥构造函数有两个特点:一是新创建的实例的方法不引用this;二是不使用new关键字调用构造函数。

首先回顾一下构造函数模式:

function Person(name){
  this.name = name;
  this.sayName = function(){
    console.log(this.name);
  }
}

var p = new Person('Bob');

console.log(p.name);//Bob
console.log(p.sayName());//Bob

如以上例子所示:

  1. sayName方法中引用了this
  2. 创建对象是通过new关键字调用构造函数。

此外,传入构造函数的name既可以通过p直接访问,也可以通过sayName函数访问,甚至可以通过p直接修改,name是公共属性,很容易被修改。现在我们按照稳妥构造函数的模式来改写这个例子:

function Person(name){
  var o = new Object();
  o.sayName = function(){
    console.log(name);
  }
  return o;
}

var p = Person('Bob');
p.sayName();//Bob

可以看到,在以这种模式创建的对象中,除了使用sayName方法之外,没有其他办法可以访问name的值,而且没法改变传入构造函数的值。即使有其他代码会给这个对象添加方法或属性,也不可能有别的办法访问传入到构造函数中的原始数据。稳妥构造函数模式提供的这种安全性,使得它非常适合在某些安全执行环境——例如ADsafe和Caja提供的环境下使用。

需要注意的是与寄生构造函数类似,使用稳妥构造函数模式创建的对象与构造函数之间也没有什么关系,因此instanceof操作符对这种对象也没有意义。

© 著作权归作者所有

共有 人打赏支持
Bob2100
粉丝 23
博文 86
码字总数 47062
作品 0
浦东
高级程序员
私信 提问
JavaScript继承(二)——借用构造函数

JavaScript继承(一)——原型链中提出原型链继承的两个问题:一是原型的数据共享问题,二是创建子类型的实例时,不能向父类型的构造函数中传递参数。这两个问题的根源还是在于使用原型模式创...

Bob2100
01/20
0
0
JavaScript创建对象(四)——组合使用构造函数和原型模式

在JavaScript创建对象(三)——原型模式中,我们阐述了原型模式存在的两个问题:一是没办法通过构造函数初始化对象属性,二是共享引用类型的数据导致数据错乱。于是我们提出组合使用两种模式...

Bob2100
2018/10/13
0
0
JavaScript OOP 创建对象的7种方式

我写JS代码,可以说一直都是面向过程的写法,除了一些用来封装数据的对象或者jQuery插件,可以说对原生对象了解的是少之又少。所以我拿着《JavaScript高级程序设计 第3版》恶补了一下,这里坐...

吕亚辉
2015/06/07
0
0
JavaScript继承(五)——寄生式继承

首先回顾一下原型式继承: 寄生式继承是与原型式继承紧密相关的一种思路,并且同样也是由克罗克福德推而广之的。 说到寄生式继承不得不说工厂模式和寄生构造函数模式创建对象。下面来回顾一下...

Bob2100
02/13
0
0
JavaScript继承(六)——寄生组合式继承

JavaScript继承(三)——组合继承中讲到,组合继承是JavaScript中最常用的继承模式,但是它也有自己的不足之处,现在我们就来剖析它的不足,如下示例: 使用组合继承让继承实际上分为两步:...

Bob2100
02/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【机器学习PAI实战】—— 玩转人工智能之商品价格预测

摘要: 我们经常思考机器学习,深度学习,以至于人工智能给我们带来什么?在数据相对充足,足够真实的情况下,好的学习模型可以发现事件本身的内在规则,内在联系。我们去除冗余的信息,可以...

zhaowei121
12分钟前
0
0
Spring拓展接口之FactoryBean,我们来看看其源码实现

是什么 FactoryBean的源码比较简单,大家可以细读下其注释,我做了简单的如下翻译 /** * 实现此接口的bean不能用作普通bean。此bean暴露的对象是通过getObject()创建的对象,而不是它自身...

java菜分享
16分钟前
1
0
Pod在多可用区worker节点上的高可用部署

一、 需求分析 当前kubernetes集群中的worker节点可以支持添加多可用区中的ECS,这种部署方式的目的是可以让一个应用的多个pod(至少两个)能够分布在不同的可用区,起码不能分布在同一个可用...

阿里云官方博客
22分钟前
0
0
深入理解 Hive 分区分桶 (Inceptor)

分区是hive存放数据的一种方式。将列值作为目录来存放数据,就是一个分区。这样查询时使用分区列进行过滤,只需根据列值直接扫描对应目录下的数据,不扫描其他不关心的分区,快速定位,提高查...

hblt-j
30分钟前
0
0
数据结构

什么是数据结构 1、数据 数据是描述客观世界的数字、字符以及一切能够输入到计算机中,并且能够被计算机程序处理的符号集合。简言之,数据就是计算机加工处理的原料,是信息的载体。 2、数据...

stars永恒
40分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部