zoukankan      html  css  js  c++  java
  • 实现new关键字

    一、new做了什么
    1.创建了一个全新的对象。
    2.这个对象会被执行[[Prototype]](也就是__proto__)链接。
    3.生成的新对象会绑定到函数调用的this。
    4.通过new创建的每个对象将最终被[[Prototype]]链接到这个函数的prototype对象上。
    5.如果函数没有返回对象类型Object(包含Functoin, Array, Date, RegExg, Error),那么new表达式中的函数调用会自动返回这个新的对象。

    <!-- 解释2
    先理清楚 new 关键字调用函数都的具体过程,那么写出来就很清楚了
    首先创建一个空的对象,空对象的__proto__属性指向构造函数的原型对象
    把上面创建的空对象赋值构造函数内部的this,用构造函数内部的方法修改空对象
    如果构造函数返回一个非基本类型的值,则返回这个值,否则上面创建的对象
    -->
            <script type="text/javascript">
                function newOperator(ctor){
                    if(typeof ctor !== 'function'){
                      throw 'newOperator function the first param must be a function';
                    }
                    newOperator.target = ctor;
                    var newObj = Object.create(ctor.prototype);
                    var argsArr = [].slice.call(arguments, 1);
                    var ctorReturnResult = ctor.apply(newObj, argsArr);
                    var isObject = typeof ctorReturnResult === 'object' && ctorReturnResult !== null;
                    var isFunction = typeof ctorReturnResult === 'function';
                    if(isObject || isFunction){
                        return ctorReturnResult;
                    }
                    return newObj;
                }
                
                // es6版本
                function _new(fn, ...arg) {
                    const obj = Object.create(fn.prototype);
                    const ret = fn.apply(obj, arg);
                    return ret instanceof Object ? ret : obj;
                }
                
                function Student (){
                    this.name = '1'
                }
                Student.prototype.sayName = func
                
                let student = _new(Student)
                
                console.log(student.__proto__ === Student.prototype) //实例的__proto指向构造函数的原型
            </script>
  • 相关阅读:
    The specified framework 'Microsoft.NETCore.App', version '1.0.1' was not found 解决办法
    docker registry push错误“server gave HTTP response to HTTPS client”
    windows server 2016安装docker
    Opserver 初探三《服务器数据监控》
    Opserver 初探二《exceptions配置》
    Opserver 初探一《Opserver的搭建》
    centos 7 免密登录
    nginx 入门配置
    php适配器模式
    进程和线程
  • 原文地址:https://www.cnblogs.com/wangxi01/p/11590193.html
Copyright © 2011-2022 走看看