乐趣区

20190808前端笔记自己写一个new方法

先贴一下代码

      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 的原型链中

退出移动版