前端js面试题1---手撕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 type="text/javascript">
        // 创建一个对象
        // 将构造函数的作用域赋给新对象 this执行新创建的对象
        // 执行构造函数中的代码
        // 判断:如果传入的对象的类型是对象,则返回新对象;反之直接返回

        // 参考链接:https://blog.csdn.net/caoluola2594/article/details/100962398
        // 自己疑惑的地方:!!!!
        // 构造函数如果返回值为对象,那么这个返回值会被正常使用
        // 这个例子告诉了我们一点,构造函数尽量不要返回值。因为返回原始值不会生效,返回对象会导致 new 操作符没有作用。
        function New() {
            var obj = {};
            var Constroctor = [].shift.call(arguments); // 将第一个值拿出来
            obj.__proto__ = Constroctor.prototype; // 将对象与构造函数原型链接起来
            var result = Constroctor.apply(obj, arguments); // 将构造函数的this指向这个对象,并传递参数
            
            return typeof result === "object" ? result : obj;
        }

        // 构造函数
        function Person(name,age) { 
            this.name = name;
            this.age = age;
        }

        // 有返回对象的构造函数
        function Test(name, age) { 
            this.name = name;
            this.age = age;
             
            return {sex:"女"};
        }

        var c = New(Person, 'sms', 12);
        console.log(c); // Person {name: "sms", age: 12}


        var d = New(Test, 'ssm', 20);
        console.log(d); // {sex: "女"}  导致New操作符失效
    </script>
</body>
</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值