JS 手写 new

JS 手写 new


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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        //Person类
        function Person(name, age) {
            this.name = name;
            this.age = age;
            //构造函数如果return一个object类型值,则不再返回实例化对象
            //如果return的是一个基本类型的值,则不影响返回实例化对象
            return 1;
        }
        Person.prototype.study = function () {
            console.log("HTML5");
        }

        var p1 = new Person("xiaowang", 30);
        console.log(p1)

        /* 
            new做了什么?、
                1.创建了一个对象
                2.调用构造函数,并把构造函数的this 指向了这个对象
                3.对象的隐式原型指向了当前函数的显式原型(构成原型链)在
                4.判断构造函数的返回值,如果是基本类型,则正常返回实例化对象,
                  如果是对象类型,则返回当前的对象
        */

        function myNew(constr) {
            //1.创建一个对象
            var obj = {};
            //2.调用构造函数,并把构造函数的this指向obj,并且拿到构造函数的返回值
            var re = constr.apply(obj, Array.from(arguments).slice(1));
            //3.修正原型链,把obj的隐式原型指向构造函数的显式原型
            obj.__proto__ = constr.prototype;

            //4.判断re是什么类型,如果是对象类型则直接返回re
            if (typeof re === 'object' && re != null || typeof re === "function") {
                return re;
            }
            //把实例化对象返回
            return obj;
        }

        var p1 = myNew(Person, "xiaowang", 30);
        var p2 = myNew(Person, "xiaoli", 20);
        console.log(p1, p2);
        console.log(p1.constructor) //Person
        console.log(p1.study === p2.study) //true
    </script>
</body>

</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值