new一个实例
// es5
const Lijianhua = function () {
this.lastname = 'li'
this.firstname = 'jianhua'
}
Lijianhua.prototype.say = function () {
console.log('hi')
}
const her = new Lijianhua()
her.say()
// es6 是es5的语法糖
class Lijianhua {
constructor () {
this.lastname = 'li'
this.firstname = 'jianhua'
}
say () {
console.log('hi')
}
}
const her = new Lijianhua()
her.say()
new操作中发生了什么?
new 一个对象过程中,主要发生了以下步骤:
- 以构造器的prototype属性为原型,创造一个新的、空的对象
- 将它的引用赋给构造器的 this,同时将参数传到构造器中执行
- 如果构造器没有手动返回对象,则返回第一步创建的新对象,如果有,则舍弃掉第一步创建的新对象,返回手动return的对象。
实现一个new方法
class Lijianhua {
constructor () {
this.lastname = 'li'
this.firstname = 'jianhua'
}
say () {
console.log('hi')
}
}
// 自己定义的new方法
const newMethod = function (Parent, ...rest) {
// 1.以构造器的prototype属性为原型,创建新对象;
const child = Object.create(Parent.prototype)
// 2.将this和调用参数传给构造器执行
const result = Parent.apply(child, rest)
// 3.如果构造器没有手动返回对象,则返回第一步的对象
return typeof result === 'object' ? result : child
}
// 创建实例,将构造函数Parent与形参作为参数传入
const her = newMethod(Lijianhua)
her.say() // 'hi';
console.log(her instanceof Lijianhua) // true