先贴一下代码
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 的原型链中