puppeteer - 操作支付宝报“操作频繁”错误的思考
一:为私有变量创建get()方法
这种方式可以创建 “伪” 只读属性。这并不是一种好方法,因为使用_函数_获得只读的_属性_不太符合一般的逻辑。
/**
* Represent a used car.
*
* @constructor
*/
function Car() {
var SELF = this,
odometer = 0;
/**
* Increment the odometer
*
* @param {Number} miles
*/
SELF.drive = function(miles) {
odometer += Math.abs(miles);
};
/**
* Get a protected odometer reading
*
* @return {Number}
*/
SELF.get_odometer = function() {
return odometer;
};
}
var subaru = new Car();
subaru.drive(500);
subaru.get_odometer(); // 500
二:使用Object.defineProperties
使用 ECMAScript 5 的新特性灵活地定义变量。
/**
* Represent a used car.
*
* @constructor
*/
function Car() {
var SELF = this,
_odometer = 0;
/**
* Increment the odometer
*
* @param {Number} miles
*/
SELF.drive = function(miles) {
_odometer += Math.abs(miles);
};
/**
* Get a protected odometer reading
*
* @return {Number}
*/
Object.defineProperties(this, {
odometer: {
get: function() {
return _odometer;
}
}
});
}
var subaru = new Car();
subaru.drive(500);
subaru.odometer; // 500
subaru.odometer = 0; // does nothing
subaru.odometer; // 500
三:使用新语法
虽然类是 function 的语法糖,但定义类时无法像 function 一样定义私有变量(constructor 中定义的变量都是公有变量),所以这里需要用到用到类字段声明。
类字段声明是 TC39 提出的新语法,现在只进行到阶段 3 候选阶段(到阶段 4 完成这个语法才算是准备好将包括在 ES 规范中),所以下面的代码需要用 Babel 转换成旧语法才可以使用。
/**
* Represent a used car.
*
* @constructor
*/
class Car {
#odometer = 500;
get odometer() {
return this.#odometer;
}
}
var subaru = new Car();
subaru.odometer; // 500
subaru.odometer = 0; // TypeError: Cannot set property odometer of #<Car> which has only a getter
通过分析转换为 ES5 的源码可以看出,其实get方法本质还是使用了Object.defineProperty,私有变量使用了WeekMap进行存储。
// Babel 转换后的代码
"use strict";
function _instanceof(left, right) {
if (
right != null &&
typeof Symbol !== "undefined" &&
right[Symbol.hasInstance]
) {
return right[Symbol.hasInstance](left);
} else {
return left instanceof right;
}
}
function _classCallCheck(instance, Constructor) {
if (!_instanceof(instance, Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
function _createClass(Constructor, protoProps, staticProps) {
if (protoProps) _defineProperties(Constructor.prototype, protoProps);
if (staticProps) _defineProperties(Constructor, staticProps);
return Constructor;
}
function _classPrivateFieldGet(receiver, privateMap) {
if (!privateMap.has(receiver)) {
throw new TypeError("attempted to get private field on non-instance");
}
var descriptor = privateMap.get(receiver);
if (descriptor.get) {
return descriptor.get.call(receiver);
}
return descriptor.value;
}
var Car =
/*#__PURE__*/
(function() {
function Car() {
_classCallCheck(this, Car);
_odometer.set(this, {
writable: true,
value: 500
});
}
_createClass(Car, [
{
key: "odometer",
get: function get() {
return _classPrivateFieldGet(this, _odometer);
}
}
]);
return Car;
})();
var _odometer = new WeakMap();
var subaru = new Car();
subaru.odometer; // 500
subaru.odometer = 0; // TypeError: Cannot set property odometer of #<Car> which has only a getter
参考
puppeteer - 操作支付宝报“操作频繁”错误的思考的更多相关文章
- oracle数据库登录连接很慢;kettle连接oracle 报 IO 错误,socket time out 问题解决记录
问题描述: 1:oracle数据库连接登陆时突然变得很慢:sqldeveloper链接数据库很慢: 2:Kettle-spoon etl程序访问数据库,任务执行时报 :数据库连接 IO错误 :Sock ...
- 调式WP程序报0x80131500错误的解决办法
在虚拟机上安装了win8系统和VS2013,但是在允许第一个WP程序时,居然报0x80131500错误信息,经查询原来是VS2013需更新的问题,如果你用的是VS2012,但是又系统升级到了win8. ...
- MyEclipse导入Maven项目pom文件第一行报错,运行Tomcat报Log4j错误--解决方法
问题描述: 前一段时间电脑第一次导入Maven项目,又是pom文件错,改好后又是运行Tomcat报Log4j错误,一直倒腾了近一个月程序才成功跑起来,太不容易. 也上网查了很长时间,没一个方法能解决我 ...
- 关于使用CodeFirst,修改类或上下文时操作数据库报错解决方法
在操作已经创建好的数据库时,若是添加新的实体类或者修改原有数据库上下文,会报如下错误: The model backing the 'StudentDbContext' context has cha ...
- win10操作系统 安装nodejs报2503错误解决方法
报该错误的原因是由于安装操作没有获得足够的管理权限导致. 在电脑左下角开始菜单[右键]选择"命令提示符(管理员)“ 敲入如下命令 msiexec /package 后面加你nodejs的本机 ...
- eclipse启动tomcat访问http://localhost:8080 报404错误
eclipse正常启动tomcat,但是 访问http://localhost:8080 却报404错误 修改下配置 就好操作如下图 打开eclipse的server视图,双击配置好的那个tomcat ...
- Kibana中的Coordinate Map地图报索引错误的问题
今天做地图定位展示,展示的是ApacheWeb服务器的访问日志文件中的来源IP.但是中间出现了报错环节,说是索引不能匹配到geo_point类型,实在是不懂这是在说什么,后来在网站找了方法就解决了.主 ...
- oracle10g连接自动断开,报ORA-03135错误
问题描述: oracle使用过一段时间,连接断开,报ORA-03135错误. 问题挖掘: 用pl/sql和sqlplus连接oracle,也存在该问题,确定该问题与连接方式无关. 查看服务器,发现没有 ...
- yii2:doajax(post)会报500错误
yii2:doajax(post)会报500错误:这是因为yii2开启了防御csrf的攻击机制,可去先去掉,在控制器里去掉:public $enableCsrfValidation = false , ...
随机推荐
- 错误信息 NSError
一.获取系统的错误信息 比如移动文件时,获取文件操作错误: NSError *e = nil;[[NSFileManager defaultManager] moveItemAtPath:source ...
- 批处理 使用默认浏览器 打开html文件
@echo offfor /f "tokens=3,4" %%a in ('"reg query HKEY_CLASSES_ROOT\http\shell\open\co ...
- linux命令详解——ftp
ftp服务器在网上较为常见,Linux ftp命令的功能是用命令的方式来控制在本地机和远程机之间传送文件,这里详细介绍Linux ftp命令的一些经常使用的命令,相信掌握了这些使用Linux 进行ft ...
- shell 获取结果中的第n列,第n行
ls -l | awk '{print $5}' | sed -n '2p' awk 是很实用的文本处理命令,print 到后带的是你要获取第几列,sed -n 是指定第几行.
- 简单xml示例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.X ...
- CSS中cursor属性
光标类型 CSS十字准心 cursor: crosshair;手 cursor: pointer;cursor: hand;写两个是为了照顾IE5,它只认hand.等待/沙漏 cursor: wa ...
- 解决Javaweb中HTTP500的问题
当我们新建一个Web项目后,运行时可能出现HTTP-500的错误如下图所示 一般是由于路径配置出错 即你电脑上的Tomcat版本与代码本身版本不一致或没有配置路径造成的 解决方法如下 一.鼠标右击你 ...
- restful api 相关
404:资源没有找到400:参数错误 200:Get获取成功201:Post创建成功202:Put更新成功 401:未授权403:当前的资源禁止 500:服务器的未知错误 错误码 错误信息 当前url ...
- 动软生成器 Liger model生成模板
<#@ template language="c#" HostSpecific="True" #> <#@ output extension= ...
- qt5-帮助文档的说明