首页 > 编程语言 >13 JavaScript关于prototype(超重点)

13 JavaScript关于prototype(超重点)

时间:2023-08-22 11:45:45浏览次数:30  
标签:function __ 13 proto 对象 JavaScript 原型 prototype

13 JavaScript关于prototype(超重点)

prototype是js里面给类增加功能扩展的一种模式.
写个面向对象来看看.

function People(name, age){
    this.name = name;
    this.age = age;
    this.run = function(){
        console.log(this.name+"在跑")
    }
}

p1 = new People("张三", 18);
p2 = new People("李四", 19);

p1.run();
p2.run();

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

function People(name, age){
    this.name = name;
    this.age = age;
    this.run = function(){
        console.log(this.name+"在跑")
    }
}

// 通过prototype可以给People增加功能
People.prototype.xxoo = function(){
    console.log(this.name+"还可以xxoo");
}

p1 = new People("张三", 18);
p2 = new People("李四", 19);

p1.run();
p2.run();

p1.xxoo();
p2.xxoo();

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

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

  1. 构造器
    构造一个对象的函数. 叫构造器.
function People(){  //这个东西就是构造器 constractor

}

var p = new People(); // 调用构造器
p.constractor == People; // true
  1. 原型对象
    每一个js对象中. 都有一个隐藏属性__proto__指向该对象的原型对象. 在执行该对象的方法或者查找属性时. 首先, 对象自己是否存在该属性或者方法. 如果存在, 就执行自己的. 如果自己不存在. 就去找原型对象.
function Friend(){
    this.chi = function(){
        console.log("我的朋友在吃");
    }
}
Friend.prototype.chi = function(){
    console.log("我的原型在吃")
}

f = new Friend();
f.chi(); // 此时. 该对象中. 有chi这个方法.  同时, 它的原型对象上, 也有chi这个方法.
// 运行结果:
// 我的朋友在吃
  1. prototype__proto__有什么关系?
    在js中. 构造器的prototype属性和对象的__proto__是一个东西. 都是指向这个原型对象.
f.__proto__ === Friend.prototype   // true
  1. 原型链
    这个比较绕了. 我们从前面的学习中, 了解到. 每个对象身体里. 都隐藏着__proto__也就是它的原型对象. 那么我们看哈, 原型对象也是对象啊, 那么也就是说. 原型对象也有__proto__属性.

类似于.....这样:

f.__proto__.__proto__

打印出来的效果是这样的:
image
此时. 又出现一堆看不懂的玩意. 这些玩意是什么? 这些其实是Object的原型.

f.__proto__.__proto__ === Object.prototype

所以, 我们在执行f.toString()的时候不会报错. 反而可以正常运行. 原因就在这里.

执行过程: 先找f对象中是否有toString. 没有, 找它的原型对象.原型对象中没有, 继续找原型对象的原型对象. 直至你找到Object的原型为止. 如果还是没有. 就报错了.

f.hahahahahahah()  // 报错. 

综上, 原型链是js 方法查找的路径指示标.
5. 我们用原型链能做什么?(每日一恶心)
我们来看一段神奇的代码.

(function(){debugger})();

这样一段代码可以看到. 浏览器进入了debugger断点.

那么这段代码的背后是什么呢? 注意. 在js代码执行时. 每一个function的对象都是通过Function()来创建的. 也就是说. 函数是Function()的对象.

function fn(){}
console.log(fn.proto.constructor); // ƒ Function() { [native code] }
这样一段代码可以看到. 浏览器进入了debugger断点.

那么这段代码的背后是什么呢? 注意. 在js代码执行时. 每一个function的对象都是通过Function()来创建的. 也就是说. 函数是Function()的对象.

function fn(){}
console.log(fn.__proto__.constructor); // ƒ Function() { [native code] }

函数就是Function的对象. 那么. 我们可以通过Function来构建一个函数.

new Function('debugger')();

OK. 这东西对我们来说有什么用. 上代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="haha.js"></script>
  <script>
    txsdefwsw();
  </script>
</head>
<body>
    有内鬼. 终止交易
</body>
</html>

haha.js 中的内容如下:

function txsdefwsw() {
    var r = "V", n = "5", e = "8";

    function o(r) {
        if (!r) return "";
        for (var t = "", n = 44106, e = 0; e < r.length; e++) {
            var o = r.charCodeAt(e) ^ n;
            n = n * e % 256 + 2333, t += String.fromCharCode(o)
        }
        return t
    }

    try {
        var a = ["r", o("갯"), "g", o("갭"), function (t) {
            if (!t) return "";
            for (var o = "", a = r + n + e + "7", c = 45860, f = 0; f < t.length; f++) {
                var i = t.charCodeAt(f);
                c = (c + 1) % a.length, i ^= a.charCodeAt(c), o += String.fromCharCode(i)
            }
            return o
        }("@"), "b", "e", "d"].reverse().join("");
        !function c(r) {
            (1 !== ("" + r / r).length || 0 === r) && function () {
            }.constructor(a)(), c(++r)
        }(0)
    } catch (a) {
        setTimeout(txsdefwsw, 100);
    }
}

页面跑起来没什么问题. 但是会无限debugger;

解决方案:

  1. 找到断点出. 右键-> never pause here;
  2. 写js hook代码;
var x = Function; // 保留原来的Function
  Function = function(arg){
  	arg = arg.replace("debugger", "");
  	return new x(arg);
  }

  var qiaofu_function_constructor = (function(){}).__proto__.constructor;
  (function(){}).__proto__.constructor = function(arg){
  	console.log("我爱你大大");
  	if(arg ==='debugger'){
  		return function(){}
  	} else {
  		return new qiaofu_function_constructor(arg);
  	}
  }

image

[[prototype]]
__proto__
构造器.prototype
function jiami(){

}
jiami.prototype.md5 = function(){}
jiami.prototype.aes = function(){}
jiami.prototype.encrypt = function(){}
var s = new jiami();
s.md5();

标签:function,__,13,proto,对象,JavaScript,原型,prototype
From: https://www.cnblogs.com/zczhaod/p/17647961.html

相关文章

  • 12 JavaScript 关于eval函数
    12eval函数eval本身在js里面正常情况下使用的并不多.但是很多网站会利用eval的特性来完成反爬操作.我们来看看eval是个什么鬼?从功能上讲,eval非常简单.它和python里面的eval是一样的.它可以动态的把字符串当成js代码进行运行.s="console.log('我爱你')";eval(s);也......
  • Web_JavaScript_客户端监测;
    //client_detection.js客户端监测//client自动运行varclient=function(){//呈现引擎varengine={ie:0,gecko:0,webkit:0,khtml:0,opera:0,//完整版本号ver:null......
  • JavaScript中的字符串
    在JavaScript中,用于表示文本的类型称为字符串(String)。字符串是一个不可变的有序序列,由16位值组成,其中每个值代表一个Unicode字符。字符串的length属性表示它包含的16位值的数量。JavaScript的字符串(以及数组)使用从零开始的索引,因此第一个16位值的索引是0,第二个值的索引是1,依此类推......
  • 水果音乐制作软件fl studio v21.1.0.3713 中文特别版2023系统配置要求
    水果音乐制作软件flstudiov21.1.0.3713中文特别版是一个功能完备的音乐制作环境,能够进行多轨道音频录制、音序处理和混音,可以帮助用户创作专业质量的音乐轨道。借助VST托管、灵活的混音器、高级MIDI和ReWire支持,您将轻松驾驭各种音乐风格。歌曲或循环可以导出为.wav、.......
  • t113-c-制作wifi设置页面
    c转命令行首先我们要用到命令行,c和命令行这么转换呢?https://blog.csdn.net/arv002/article/details/112711673根据这篇文章那么:popen:什么是popen?https://www.cnblogs.com/52php/p/5722238.html简单来说就是c语言和cmmd的交互函数,注意这个函数会产生子进程简单的测试一下:#......
  • py之路——day13-20230821:生成器和迭代器
    作者:zb一、列表生成式1、定义用来生成列表的表达式2、特点可以使代码更加简洁示例代码如下:1#普通方法定义列表2a=[1,2,3]3print(a)4#列表生成式方法定义列表5b=[i*2foriinrange(10)]6print(b)7#如果不用列表生成式,上述b列表定义会很麻烦......
  • 字符设备驱动-13.ioctl命令详解
    1引入ioctl一个字符设备驱动通常会实现设备打开、关闭、读、写等功能,在一些需要细分的情境下,如果需要扩展新的功能增添命令,通常以增设ioctl()命令的方式实现。对于ioctl这个系统调用接口,Linux的创始人在2.0版本之前并没有进行添加,仅有write和read两个接口,但是后来发现当需要......
  • 「NOIP2013」货车运输 题解
    「NOIP2013」货车运输前言这道题算是一个稍有思维难度的MST+LCA题目了。稍微卡了一会(0-88-88-88-100(打表)-100(打表)-100(正解)),开始是打了表过了,后面在DCZ的帮助下正解通过(下面注释提到的一个坑)。题目大意给出一张无向图\(G\),有\(n\)个点和\(m\)个边\((x,y)=z\),找到一......
  • 自我介绍:20231301 周子昂
    自我介绍大家好!我叫周子昂。#(0)照片---#(1)形容词##周:思绪“周”密,严谨踏实###做事之前喜欢整体思考,有一定的布局。尽可能在做事时脚踏实地,认真仔细。事后反思总结经验教训,以便下次更好。##子:谦谦君“子”,温和有礼###待人接物有基本的礼仪与尊重。......
  • JavaScript基础之基于数据类型和引用数据类型
    数据类型JavaScript的数据类型有7中,包括6个基本类型和一个引用类型基本数据类型:number,string,boolean,null,undefined,symbol引用数据类型:object(数组、对象、函数、正则等)基本数据类型和引用数据类型的区别存储方式基本类型:基本数据类型的值直接存储在改变量所分配的内存......