前端new关键字,没有对象该怎么办?

78 阅读2分钟

2.png

没有对象怎么办?那当然是 new 一个出来呗

那么new到底做了些什么骚操作,能满足你拥有对象的愿望呢?

首先,你想拥有一个女朋友。在你心里肯定有一个理想型,比如纯情女高御姐萝莉......反正肯定不是这个-->

4.jpg

至少得是这个嘛

function Girl() {
    this.name = "柳yan"
    this.age = 18
    this.fn = function () {
        console.log("口齿伶俐~");
    }
}

然后有了模板我们就可以 new 一个自己的出来啦!

怎么 new

  1. 我们想要一个对象,那么肯定得创造一个对象出来吧
  2. 这个对象暂时和我们的理想型没啥关系吧,所以我们要让她们建立关系
  3. 我们是不是还得让创造出来的对象有一些属性,柳yan,18,和她的能力(就是fn方法而已啦)
  4. 把这个有了实体内容的对象返回给我们,我们不就可以......嘿嘿嘿!

咳咳,回归正题,那么new关键字到底干了些什么呢?

(1) 首先创建了一个空对象。

(2) 设置原型,将对象的原型设置为函数的prototype对象。

(3) 让函数的this指向这个对象,执行构造函数中的代码

(4) 判断函数的返回值类型,如果是值类型,则返回创建的对象,如果是引用类型,则返回这个引用类型的对象。

那么,我们能不能自己写一个类似的new关键字呢?行不行呀(xigou)

那肯定得行啊是吧!!!

function Girl(name,age) {
    this.name = name
    this.age = age
    this.fn = function () {
        console.log("口齿伶俐~");
    }
}

function _new(fn,...args) {
    // 1.创建一个新对象
    let newObj = {}
    // 2.将新对象和构造函数通过原型链连接
    newObj.__proto__ = fn.prototype
    // 3.将构造函数的this绑定到新对象上
    const result = fn.apply(newObj,args)
    // 4.根据返回值类型判断,如果是值类型返回newObj,如果是引用类型返回正常引用类型
    return result instanceof Object ? result : newObj   
}

const wzh = _new(Girl,"wzh","18")
console.log(wzh);

行啦,new很好,也只不过在代码里YY了,堆屎山去吧!程()序()员()... ...