亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JavaScript關(guān)于prototype實(shí)例詳解(超重點(diǎn))

 更新時(shí)間:2023年08月30日 09:20:25   作者:生而自由愛而無(wú)畏  
prototype是js里面給類增加功能擴(kuò)展的一種模式,這篇文章主要介紹了JavaScript關(guān)于prototype(超重點(diǎn)),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

JavaScript關(guān)于prototype(超重點(diǎn))

prototype是js里面給類增加功能擴(kuò)展的一種模式.寫個(gè)面向?qū)ο髞?lái)看看.

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();

我現(xiàn)在代碼寫完了. 突然之間, 我感覺好像少了個(gè)功能. 人不應(yīng)該就一個(gè)功能. 光會(huì)跑是不夠的. 還得能夠ooxx. 怎么辦? 直接改代碼? 可以. 但不夠好. 如果這個(gè)類不是我寫的呢? 隨便改別人代碼是很不禮貌的. 也很容易出錯(cuò). 怎么辦? 我們可以在我們自己代碼中對(duì)某個(gè)類型動(dòng)態(tài)增加功能. 此時(shí)就用到了prototype.

function People(name, age){
    this.name = name;
    this.age = age;
    this.run = function(){
        console.log(this.name+"在跑")
    }
}
// 通過(guò)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();

能看到一些效果了是吧. 也就是說(shuō). 可以通過(guò)prototype給我們的對(duì)象增加一些功能.

接下來(lái). 聊幾個(gè)重要的概念.

1.構(gòu)造器

構(gòu)造一個(gè)對(duì)象的函數(shù). 叫構(gòu)造器.

function People(){  //這個(gè)東西就是構(gòu)造器 constractor
}
var p = new People(); // 調(diào)用構(gòu)造器
p.constractor == People; // true

2.原型對(duì)象

每一個(gè)js對(duì)象中. 都有一個(gè)隱藏屬性 __proto__ 指向該對(duì)象的 原型對(duì)象 . 在執(zhí)行該對(duì)象的方法或者查找屬性時(shí). 首先, 對(duì)象自己是否存在該屬性或者方法. 如果存在, 就執(zhí)行自己的. 如果自己不存在. 就去找 原型對(duì)象 .

function Friend(){
    this.chi = function(){
        console.log("我的朋友在吃");
    }
}
Friend.prototype.chi = function(){
    console.log("我的原型在吃")
}
f = new Friend();
f.chi(); // 此時(shí). 該對(duì)象中. 有chi這個(gè)方法.  同時(shí), 它的原型對(duì)象上, 也有chi這個(gè)方法.
// 運(yùn)行結(jié)果:
// 我的朋友在吃

3.prototype __proto__ 有什么關(guān)系?

在js中. 構(gòu)造器的prototype屬性和對(duì)象的 __proto__ 是一個(gè)東西. 都是指向這個(gè) 原型對(duì)象 .

f.__proto__ === Friend.prototype   // true

4.原型鏈

這個(gè)比較繞了. 我們從前面的學(xué)習(xí)中, 了解到. 每個(gè)對(duì)象身體里. 都隱藏著 __proto__ 也就是它的 原型對(duì)象 . 那么我們看哈, 原型對(duì)象 也是 對(duì)象 啊, 那么也就是說(shuō). 原型對(duì)象 也有 __proto__ 屬性.

類似于.....這樣:

f.__proto__.__proto__

打印出來(lái)的效果是這樣的:

此時(shí). 又出現(xiàn)一堆看不懂的玩意. 這些玩意是什么? 這些其實(shí)是Object的原型.

f.__proto__.__proto__ === Object.prototype

所以, 我們?cè)趫?zhí)行 f.toString() 的時(shí)候不會(huì)報(bào)錯(cuò). 反而可以正常運(yùn)行. 原因就在這里.

執(zhí)行過(guò)程: 先找 f對(duì)象 中是否有 toString . 沒(méi)有, 找它的 原型對(duì)象 . 原型對(duì)象 中沒(méi)有, 繼續(xù)找 原型對(duì)象的原型對(duì)象 . 直至你找到Object的原型為止. 如果還是沒(méi)有. 就報(bào)錯(cuò)了.

f.hahahahahahah()  // 報(bào)錯(cuò). 

綜上, 原型鏈?zhǔn)莏s 方法查找的路徑指示標(biāo) .

5. 我們用原型鏈能做什么?(每日一惡心)

我們來(lái)看一段神奇的代碼.

(function(){debugger})();

這樣一段代碼可以看到. 瀏覽器進(jìn)入了debugger斷點(diǎn).

那么這段代碼的背后是什么呢? 注意. 在js代碼執(zhí)行時(shí). 每一個(gè)function的對(duì)象都是通過(guò)Function()來(lái)創(chuàng)建的. 也就是說(shuō). 函數(shù)是Function()的對(duì)象.

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

那么這段代碼的背后是什么呢? 注意. 在js代碼執(zhí)行時(shí). 每一個(gè)function的對(duì)象都是通過(guò)Function()來(lái)創(chuàng)建的. 也就是說(shuō). 函數(shù)是Function()的對(duì)象.

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

函數(shù)就是Function的對(duì)象. 那么. 我們可以通過(guò)Function來(lái)構(gòu)建一個(gè)函數(shù).

new Function('debugger')();

OK. 這東西對(duì)我們來(lái)說(shuō)有什么用. 上代碼

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

haha.js 中的內(nèi)容如下:

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);
    }
}

頁(yè)面跑起來(lái)沒(méi)什么問(wèn)題. 但是會(huì)無(wú)限debugger;

解決方案:

  • 找到斷點(diǎn)出. 右鍵-> never pause here;
  • 寫js hook代碼;
var x = Function; // 保留原來(lái)的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);
  	}
  }

[[prototype]]
__proto__
構(gòu)造器.prototype
function jiami(){
}
jiami.prototype.md5 = function(){}
jiami.prototype.aes = function(){}
jiami.prototype.encrypt = function(){}
var s = new jiami();
s.md5();

到此這篇關(guān)于JavaScript關(guān)于prototype(超重點(diǎn))的文章就介紹到這了,更多相關(guān)js 關(guān)于prototype內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • js中獲取鍵盤按下鍵值event.keyCode、event.charCode和event.which的兼容性詳解

    js中獲取鍵盤按下鍵值event.keyCode、event.charCode和event.which的兼容性詳解

    這篇文章主要給大家介紹了關(guān)于Javascript中獲取鍵盤按下鍵值event.keyCode、event.charCode和event.which的兼容性的相關(guān)資料,文中介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-03-03
  • JavaScript中數(shù)組雙重去重的方法總結(jié)

    JavaScript中數(shù)組雙重去重的方法總結(jié)

    這篇文章主要為大家學(xué)習(xí)介紹了JavaScript中數(shù)組雙重去重的幾個(gè)常用方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-07-07
  • JavaScript實(shí)現(xiàn)的原生態(tài)兼容IE6可調(diào)可控滾動(dòng)文字功能詳解

    JavaScript實(shí)現(xiàn)的原生態(tài)兼容IE6可調(diào)可控滾動(dòng)文字功能詳解

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)的原生態(tài)兼容IE6可調(diào)可控滾動(dòng)文字功能,簡(jiǎn)單說(shuō)明了文字滾動(dòng)的實(shí)現(xiàn)原理并結(jié)合具體實(shí)例形式給出了javascript文字滾動(dòng)功能的具體實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2017-09-09
  • JS實(shí)現(xiàn)動(dòng)態(tài)添加DOM節(jié)點(diǎn)和事件的方法示例

    JS實(shí)現(xiàn)動(dòng)態(tài)添加DOM節(jié)點(diǎn)和事件的方法示例

    這篇文章主要介紹了JS實(shí)現(xiàn)動(dòng)態(tài)添加DOM節(jié)點(diǎn)和事件的方法,涉及javascript事件響應(yīng)及針對(duì)頁(yè)面dom元素節(jié)點(diǎn)與屬性的動(dòng)態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-04-04
  • Bootstrap CDN和本地化環(huán)境搭建

    Bootstrap CDN和本地化環(huán)境搭建

    這篇文章主要介紹了Bootstrap CDN和本地化環(huán)境搭建的方法,非常不錯(cuò)具有參考借鑒價(jià)值,感興趣的朋友跟著小編一起學(xué)習(xí)吧
    2016-10-10
  • JavaScript自定義事件介紹

    JavaScript自定義事件介紹

    很多DOM對(duì)象都有原生的事件支持,向div就有click、mouseover等事件,事件機(jī)制可以為類的設(shè)計(jì)帶來(lái)很大的靈活性,相信.net程序員深有體會(huì)。隨著web技術(shù)發(fā)展,使用JavaScript自定義對(duì)象愈發(fā)頻繁,讓自己創(chuàng)建的對(duì)象也有事件機(jī)制,通過(guò)事件對(duì)外通信,能夠極大提高開發(fā)效率
    2013-08-08
  • 微信小程序setInterval定時(shí)函數(shù)新手使用的超詳細(xì)教程

    微信小程序setInterval定時(shí)函數(shù)新手使用的超詳細(xì)教程

    平時(shí)開發(fā)中為實(shí)現(xiàn)倒計(jì)時(shí)效果可以使用setInterval即可,下面這篇文章主要給大家介紹了關(guān)于微信小程序setInterval定時(shí)函數(shù)新手使用的超詳細(xì)教程,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • 網(wǎng)頁(yè)中右鍵功能的實(shí)現(xiàn)方法之contextMenu的使用

    網(wǎng)頁(yè)中右鍵功能的實(shí)現(xiàn)方法之contextMenu的使用

    本文介紹一種網(wǎng)頁(yè)中實(shí)現(xiàn)右鍵功能的方案–contextMenu,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-02-02
  • 使用微信小程序制作核酸檢測(cè)點(diǎn)查詢工具

    使用微信小程序制作核酸檢測(cè)點(diǎn)查詢工具

    出門在外,沒(méi)有核酸證明寸步難行,此文將教你如何通過(guò)小程序制作一個(gè)工具幫你在人生地不熟的情況如何迅速找到核酸檢測(cè)點(diǎn),實(shí)現(xiàn)核酸點(diǎn)查詢、地圖導(dǎo)航、撥號(hào)等功能,需要的朋友可以參考下
    2022-10-10
  • js中小數(shù)轉(zhuǎn)換整數(shù)的方法

    js中小數(shù)轉(zhuǎn)換整數(shù)的方法

    js中小數(shù)轉(zhuǎn)換整數(shù)的方法有很多,有下退、上進(jìn)、四舍五入等等,需要的朋友可以了解下本文
    2014-01-01

最新評(píng)論