先贴一下代码

      let cat = function(sex, language) {
        this.sex = sex
        this.language = language
      }

      cat.prototype.say = function() {
        console.log(this.language)
      }
      cat.prototype.getSex = function() {
        console.log(`my sex is ${this.sex}`)
      }
      
      function _new(fn, ...args) {
        const obj = Object.create(fn.prototype)
        const ret = fn.apply(obj, args)
        return ret instanceof Object ? ret : obj
      }

      let mao = _new(cat, 'female', 'miao')

1.利用Object.create方法fn继承prototype原型链

Object.create(proto, [propertiesObject])

创建一个新对象,使用现有对象来提供新创建的对象的proto
  • 参数

    • proto:必须,标示新建对象的原型链,
    • propertiesObject : 可选,添加到新建对象的可枚举属性。即自己的属性
  • return

    • 在制定原型对象上添加属性后的对象。
// 创建一个以另一个空对象为原型,且拥有一个属性p的对象
o = Object.create({}, { p: { value: 42 } })

// 省略了的属性特性默认为false,所以属性p是不可写,不可枚举,不可配置的:
o.p = 24
// 不可以写,不可以配置,依旧是42
o.p
//42

o.q = 12
for (var prop in o) {
   console.log(prop)
}
//"q",无法获取p,因为该属性是无法枚举也是不可以写的。

delete o.p
//false

2.将obj新对象引入fn的方法中,顺便带入argments参数。

3.返回对象。

instanceof

ret instanceof Object
ret的原型是否在Object的原型链中

Kisnnnn
46 声望5 粉丝

[链接]