JavaScriptDemo——Day 27(bind的基本使用和仿寫bind)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>bind</title>
</head>

<body>
    <button id="btn">click</button>
    <script>
        // bind 的基本使用
        // var x = 10;
        // function show(){
        //     console.log(this.x); // window
        // }
        // show(); // 10
        // var Duyi = {
        //     x : 20
        // }
        // // function
        // var newShow = show.bind(Duyi);
        // newShow(); // 20

        // 單對象編程
        // var list = {
        //     init: function () {
        //         this.ms = 'duyi';
        //         this.dom = document.getElementById('btn');
        //         this.bindEvent();
        //     },
        //     bindEvent: function(){

        //         this.dom.onclick = this.show.bind(this,5,5); // this --> dom --> list
        //         // bind 構成一個新的函數 onclick就會往裏面傳入一個新的事件對象 而這個對象就會加入到實參列表的前面

        //     },
        //     show: function (x,y,e) { // 這裏多寫一個參數e 就會返回出這個隱式的onclick事件對象
        //         // alert(this.ms);
        //         console.log(this.ms,x,y,e); // duyi 5 5 MouseEvent
        //     }
        // }
        // list.init();

        // 在單對象編程裏遇見綁定事件 改變this的指向到對象且不直接執行



        // var x = 10;

        // function show(a,b) {
        //     console.log(this.x,a,b); // window
        // }
        // show(5,3); // 10 5 3
        // var Duyi = {
        //     x: 20
        // }
        // // function
        // var newShow = show.bind(Duyi,3); // 改變this 順便還可以傳參數 這裏3相當於newShow(3,5) 會加到實參列表之前
        // newShow(5); // 20 3 5
        // console.log(new newShow().constructor) // show


        // 總結
        // 1. 函數A調用bind方法時,需要傳遞的參數o ,x ,y,z.....
        // 2. 返回新的函數B
        // 3. 函數B在執行的時候 具體的功能還是使用的是A 不過this的指向變爲了 o|| window
        // 4. 函數B在執行的時候 傳遞的參數 會拼接到 x,y,z 後面,一併內部傳遞到A執行
        // 5. new B() 構造函數依舊是A, 而且o不會起到任何作用 

        Function.prototype.newBind = function (target) {
            var self = this;
            var args = [].slice.call(arguments, 1); // 實參數組將最前一位切割掉 
            var temp = function () {};
            var f = function () {
                // var this  = {};
                var _args = [].slice.call(arguments)
                return self.apply(this instanceof temp ? this : target || window, args.concat(
                    _args)); // 1. 啥都沒有傳那麼this指向還是window
                             // 2. 如果new了就說明 不用傳了你的原型鏈一定能找到temp 也就是self
            }
            temp.prototype = self.prototype;
            f.prototype = new temp(); // new newShow().constructor == show
            return f;
        }

        var x = 10;

        function show(a, b) {
            console.log(this.x, a, b); // window
        }
        show(); // 10 
        var Duyi = {
            x: 20
        }
        // function
        var newShow = show.newBind(Duyi, 1, 2); // 改變this 順便還可以傳參數 這裏3相當於newShow(3,5) 會加到實參列表之前
        newShow(); // 20 
        console.log(new newShow().constructor) // show
    </script>
</body>

</html>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章