进阶 2 - JS中的各种操作(非交互)

定时器

在JS中, 有两种设置定时器的方案

// 语法规则
t = setTimeout(函数, 时间)
// 经过xxx时间后, 执行xxx函数

// 示例:3秒后打印我爱你
t = setTimeout(function () {
    console.log("我爱你")
}, 3000);

window.clearTimeout(t) // 停止一个定时器

eval 函数

eval本身在js里面正常情况下使用的并不多. 但是很多网站会利用eval的特性来完成反爬操作. 我们来看看eval是个什么鬼?

从功能上讲, eval非常简单. 它和python里面的eval是一样的. 它可以动态的把字符串当成js代码进行运行.

s = "console.log('我爱你')";
eval(s);

也就是说. eval里面传递的应该是即将要执行的代码(字符串). 那么在页面中如果看到了eval加密该如何是好? 其实只要记住了一个事儿. 它里面不论多复杂. 一定是个字符串.

比如,

这一坨看起来, 肯定很不爽. 怎么变成我们看着很舒服的样子呢? 记住. eval()里面是字符串. 记住~!!

那我想看看这个字符串长什么样? 就把eval()里面的东西拷贝出来. 执行一下. 最终一定会得到一个字符串. 要不然eval()执行不了的. 对不...于是就有了下面的操作.

http://tools.jb51.net/password/evalencodearrow-up-right, 再赠送你一个在线JS处理eval的网站. 大多数的eval加密. 都可以搞定了。

prototype和__proto__

逆向代码示例:

示例:

我现在代码写完了. 突然之间, 我感觉好像少了个功能. 人不应该就一个功能. 光会跑是不够的. 还得能够学习. 怎么办? 直接改代码? 可以. 但不够好. 如果这个代码封装不是我写的呢? 随便改别人代码是很不礼貌的. 也很容易出错. 怎么办? 我们可以在我们自己代码中对某个类型动态增加功能. 此时就用到了prototype.

能看到一些效果了是吧. 也就是说. 可以通过prototype给我们的对象增加一些功能. 那么,什么是prototype呢?

接下来. 聊几个重要的概念.

1. 原型对象

每一个js对象中. 都有一个隐藏属性__proto__指向该对象的原型对象. (People.prototype)

原型对象用于存储所有实例对象共享的属性和方法,以减少每个实例对象重复存储相同属性和方法的开销。

在执行该对象的方法或者查找属性时. 首先, 对象自己是否存在该属性或者方法. 如果存在, 就执行自己的. 如果自己不存在. 就去找原型对象.

实例对象是可以共享它的原型链上所有的原型对象存在的成员

对象的原型成员重写:

2. prototype__proto__有什么关系?

在js中. 函数名的prototype属性和对象的__proto__是一个东西. 都是指向这个原型对象.

3. 原型链

原型链是JavaScript中对象继承属性和方法的一种方式。具体介绍如下:

这个比较绕了. 我们从前面的学习中, 了解到. 每个对象身体里. 都隐藏着__proto__也就是它的原型对象. 那么我们看哈, 原型对象也是对象啊, 那么也就是说. 原型对象也有__proto__属性.

类似于.....这样:

此时. 又出现一堆看不懂的玩意. 这些玩意是什么? 这些其实是Object的原型.

练习测试:理解下属代码

重点总结:

  1. prototype关键字是可以给对象动态添加成员

  2. 原型对象中的成员是可以被所有实例对象共享

  3. 对象在调用某一个成员时,该成员有可能是对象自身封装的成员也可能是该对象原型上的成员

Last updated