先文字描述过程,再手撕代码,最后扩展涉及的知识点
过程
(1)创建一个空对象
(2)继承指定构造函数(原本继承的是Object)
(3)将this和调用参数传给构造器执行(call,apply)
(4)如果构造起没有手动返回对象,那就返回this指向的那个对象
代码实现
function Person(name,age){
let this = {} // 隐式
this.name = name
this.age = age
return this // 隐式
}
function newMethod(Parent, ...setValue) {
let newObj = {}; // 创建一个新对象
newObj.__proto__ = Parent.prototype; // 继承构造函数
Parent.apply(newObj, setValue); // this和参数传递给构造函数执行
//如果构造函数没有手动返回,则返回newObj 否则返回构造函数手动返回的对象
if(!Parent()){
return newObj
} else {
return Parent()
}
}
console.log(newMethod(Person,'lihao', 21 )) // Person { name: 'lihao', age: 21 }
ok如果上面的代码手动返回一个对象
function Person(name,age){
this.name = name
this.age = age
return { // 手动返回
name: 'jidaoyan',
age: 23
}
}
console.log(newMethod(Person,'lihao', 21 )) // { name: 'jidaoyan', age: 23 }
如果有构造函数本身有手动返回,那么传入的参数就不起作用
扩展知识点
构造函数继承构造函数:现在有两个构造函数Person和Animals,Person要继承Animals
// 直接继承
Person.prototype = Animals.prototype
Person.prototype.constructor = Person
对象继承构造函数: 对象是怎么来的 实质是不是new Object(),实例对象的proto 指向它构造函数的原型对象
newObj.__proto__ = Parent.prototype; //上面例子中对象继承构造函数的方法
apply和call和bind的区别