最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • JS中new关键字的实现

    正文概述 掘金(木心471)   2021-03-23   541

    js中的new关键字主要用在以构造函数的方式创建对象时,像这样:

     function Foo(name, age, sex) {
         this.name = name
         this.age = age
         this.sex = sex
         // return 1  //如果返回了一个基本数据类型数据,下方的person会生成一个对象
         // return {a:1} //如果返回了一个非基本数据类型数据,下方的person为{a:1}
     }
     var person = new Foo('小明', '18', '男')
     consloe.log(person)
     console.log(person.name)  //小明
    

    我们发现这个构造函数没有显示返回任何值,如果有返回值会怎样呢?

     function Foo(name, age, sex) {
         this.name = name
         this.age = age
         this.sex = sex
         return 1  
     }
     var person = new Foo('小明', '18', '男')
     consloe.log(person)
     console.log(person.name)  //小明
    

    返回了一个1,但是没有任何影响,结果没有变化
    由此得出一个结论:构造函数如果返回了一个原始值类型,实际上会生成一个空对象,没有任何意义

    如果返回对象会怎么样呢?

     function Foo(name, age, sex) {
         this.name = name
         this.age = age
         this.sex = sex
         return {a:1} //如果返回了一个非基本数据类型数据,下方的person为{a:1}
     }
     var person = new Foo('小明', '18', '男')
     consloe.log(person)  //{a:1}
     console.log(person.name)  //undefined
    

    返回了一个对象,这个对象的值就会被正常返回

    返回结果注意

    通过这种方式获取对象时,最终不一定返回的是对象,要看构造函数的返回值是什么,如果构造函数返回的是原始值类型,实际会生成一个对象,如果构造函数返回的是引用值类型,则实际返回的是该引用值类型。

    上一段代码很容易让人认为 Foo 是一个构造函数,因为我们使用 new 来调用它并且看到它“构造”了一个对象。实际上, Foo 和你程序中的其他函数没有任何区别。函数本身并不是构造函数,然而,当你在普通的函数调用前面加上 new 关键字之后,就会把这个函数调用变成一个“构造函数调用”。实际上, new 会劫持所有普通函数并用构造对象的形式来调用它。 换句话说,在 JavaScript 中对于“构造函数”最准确的解释是,所有带 new 的函数调用。 函数不是构造函数,但是当且仅当使用 new 时,函数调用会变成“构造函数调用”。 那么new关键字究竟是如何构造一个对象,使其拥有“构造函数”的属性和方法的呢?它的内部是如何实现的呢?

    new关键字创建实例对象的步骤:

    • 1.创建一个新的对象,如:var person={},因为new关键字返回的是一个对象
    • 2.新对象的__proto__属性指向构造函数的原型对象
    • 3.将构造函数的作用域赋值给新对象(也就是this对象指向新对象)
    • 4.返回新对象person

    我们就可以手动封装一个new关键字了

    // fn是构造函数
    function myNew(fn, ...args) {
        const obj = {};
        obj.__proto__ = fn.prototype;
        // 改变this指向
        let result = fn.apply(obj, args)
        // return result
        // 确保new出来的是一个对象
        return typeof result === "object" ? result : obj
    }
    

    来测试一下

     function Student(name, age, sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.play=function(){
            console.log('hhhhhhh')
        }
    }
    var student1 = myNew(Student, '小明', 18, '男')
    console.log(student1) //{name: "小明", age: 18, sex: "男", play: ƒ}
    

    参考:《你不知道的JavaScript(上卷)》


    起源地下载网 » JS中new关键字的实现

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元