翼度科技»论坛 编程开发 JavaScript 查看内容

13 JavaScript关于prototype(超重点)

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
13 JavaScript关于prototype(超重点)
prototype是js里面给类增加功能扩展的一种模式.
写个面向对象来看看.
  1. function People(name, age){
  2.     this.name = name;
  3.     this.age = age;
  4.     this.run = function(){
  5.         console.log(this.name+"在跑")
  6.     }
  7. }
  8. p1 = new People("张三", 18);
  9. p2 = new People("李四", 19);
  10. p1.run();
  11. p2.run();
复制代码
我现在代码写完了. 突然之间, 我感觉好像少了个功能. 人不应该就一个功能. 光会吃是不够的. 还得能够ooxx. 怎么办?  直接改代码?  可以. 但不够好. 如果这个类不是我写的呢? 随便改别人代码是很不礼貌的. 也很容易出错. 怎么办?  我们可以在我们自己代码中对某个类型动态增加功能. 此时就用到了prototype.
  1. function People(name, age){
  2.     this.name = name;
  3.     this.age = age;
  4.     this.run = function(){
  5.         console.log(this.name+"在跑")
  6.     }
  7. }
  8. // 通过prototype可以给People增加功能
  9. People.prototype.xxoo = function(){
  10.     console.log(this.name+"还可以xxoo");
  11. }
  12. p1 = new People("张三", 18);
  13. p2 = new People("李四", 19);
  14. p1.run();
  15. p2.run();
  16. p1.xxoo();
  17. p2.xxoo();
复制代码
能看到一些效果了是吧. 也就是说. 可以通过prototype给我们的对象增加一些功能.
接下来. 聊几个重要的概念.

  • 构造器
    构造一个对象的函数. 叫构造器.
  1. function People(){  //这个东西就是构造器 constractor
  2. }
  3. var p = new People(); // 调用构造器
  4. p.constractor == People; // true
复制代码

  • 原型对象
    每一个js对象中. 都有一个隐藏属性__proto__指向该对象的原型对象. 在执行该对象的方法或者查找属性时. 首先, 对象自己是否存在该属性或者方法. 如果存在, 就执行自己的. 如果自己不存在. 就去找原型对象.
  1. function Friend(){
  2.     this.chi = function(){
  3.         console.log("我的朋友在吃");
  4.     }
  5. }
  6. Friend.prototype.chi = function(){
  7.     console.log("我的原型在吃")
  8. }
  9. f = new Friend();
  10. f.chi(); // 此时. 该对象中. 有chi这个方法.  同时, 它的原型对象上, 也有chi这个方法.
  11. // 运行结果:
  12. // 我的朋友在吃
复制代码

  • prototype和__proto__有什么关系?
    在js中. 构造器的prototype属性和对象的__proto__是一个东西.  都是指向这个原型对象.
  1. f.__proto__ === Friend.prototype   // true
复制代码

  • 原型链
    这个比较绕了. 我们从前面的学习中, 了解到. 每个对象身体里. 都隐藏着__proto__也就是它的原型对象. 那么我们看哈, 原型对象也是对象啊, 那么也就是说. 原型对象也有__proto__属性.
类似于.....这样:
  1. f.__proto__.__proto__
复制代码
打印出来的效果是这样的:

此时. 又出现一堆看不懂的玩意. 这些玩意是什么?  这些其实是Object的原型.
  1. f.__proto__.__proto__ === Object.prototype
复制代码
所以, 我们在执行f.toString()的时候不会报错. 反而可以正常运行. 原因就在这里.
执行过程:  先找f对象中是否有toString. 没有, 找它的原型对象.原型对象中没有, 继续找原型对象的原型对象. 直至你找到Object的原型为止. 如果还是没有. 就报错了.
  1. f.hahahahahahah()  // 报错.
复制代码
综上, 原型链是js 方法查找的路径指示标.
5. 我们用原型链能做什么?(每日一恶心)
我们来看一段神奇的代码.
  1. (function(){debugger})();
复制代码
这样一段代码可以看到. 浏览器进入了debugger断点.
那么这段代码的背后是什么呢?  注意. 在js代码执行时. 每一个function的对象都是通过Function()来创建的. 也就是说. 函数是Function()的对象.
function fn(){}
console.log(fn.proto.constructor); // ƒ Function() { [native code] }
这样一段代码可以看到. 浏览器进入了debugger断点.
那么这段代码的背后是什么呢?  注意. 在js代码执行时. 每一个function的对象都是通过Function()来创建的. 也就是说. 函数是Function()的对象.
  1. function fn(){}
  2. console.log(fn.__proto__.constructor); // ƒ Function() { [native code] }
复制代码
函数就是Function的对象. 那么. 我们可以通过Function来构建一个函数.
  1. new Function('debugger')();
复制代码
OK. 这东西对我们来说有什么用.  上代码
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>Title</title>
  6.    
  7.   
  8. </head>
  9. <body>
  10.     有内鬼. 终止交易
  11. </body>
  12. </html>
复制代码
haha.js  中的内容如下:
  1. function txsdefwsw() {
  2.     var r = "V", n = "5", e = "8";
  3.     function o(r) {
  4.         if (!r) return "";
  5.         for (var t = "", n = 44106, e = 0; e < r.length; e++) {
  6.             var o = r.charCodeAt(e) ^ n;
  7.             n = n * e % 256 + 2333, t += String.fromCharCode(o)
  8.         }
  9.         return t
  10.     }
  11.     try {
  12.         var a = ["r", o("갯"), "g", o("갭"), function (t) {
  13.             if (!t) return "";
  14.             for (var o = "", a = r + n + e + "7", c = 45860, f = 0; f < t.length; f++) {
  15.                 var i = t.charCodeAt(f);
  16.                 c = (c + 1) % a.length, i ^= a.charCodeAt(c), o += String.fromCharCode(i)
  17.             }
  18.             return o
  19.         }("@"), "b", "e", "d"].reverse().join("");
  20.         !function c(r) {
  21.             (1 !== ("" + r / r).length || 0 === r) && function () {
  22.             }.constructor(a)(), c(++r)
  23.         }(0)
  24.     } catch (a) {
  25.         setTimeout(txsdefwsw, 100);
  26.     }
  27. }
复制代码
页面跑起来没什么问题. 但是会无限debugger;
解决方案:

  • 找到断点出. 右键-> never pause here;
  • 写js hook代码;
  1. var x = Function; // 保留原来的Function
  2.   Function = function(arg){
  3.           arg = arg.replace("debugger", "");
  4.           return new x(arg);
  5.   }
  6.   var qiaofu_function_constructor = (function(){}).__proto__.constructor;
  7.   (function(){}).__proto__.constructor = function(arg){
  8.           console.log("我爱你大大");
  9.           if(arg ==='debugger'){
  10.                   return function(){}
  11.           } else {
  12.                   return new qiaofu_function_constructor(arg);
  13.           }
  14.   }
复制代码
  1. [[prototype]]
  2. __proto__
  3. 构造器.prototype
  4. function jiami(){
  5. }
  6. jiami.prototype.md5 = function(){}
  7. jiami.prototype.aes = function(){}
  8. jiami.prototype.encrypt = function(){}
  9. var s = new jiami();
  10. s.md5();
复制代码
来源:https://www.cnblogs.com/zczhaod/p/17647961.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具