/*
基于内置的 new 关键词,我们可以创建 Dog 的一个实例 zhangsan ,实例可以调用原型上的属性和方法
需求:自己实现一个 _new 方法,也可以模拟出内置 new 后的结果
*/
/*
let zhangsan = new Dog(‘张三‘);
1、像普通函数执行一样,形成一个私有的作用域
形参赋值
变量提升
2、默认创建一个对象,让函数中的 this 执行这个对象,这个对象就是当前类的一个实例
3、代码执行
4、默认把创建的对象返回
*/
function Dog(name) {
this.name = name;
}
Dog.prototype.bark = function () {
console.log(‘hello!‘);
}
Dog.prototype.sayName = function () {
console.log(‘my name is ‘ + this.name);
}
// => Fn 当前要 new 的类 =>Dog
// => arg 后期需要给构造函数传递的参数信息 =>[‘张三‘]
function _new(Fn, ...arg) {
// => 创建一个空对象,让他的原型链指向 Fn.prototype (作为 Fn 的一个实例)
// => Object.create([AA对象]) -> 创建一个空对象 obj ,并且让空对象 obj 作为 AA对象 所属构造函数的实例(obj.__proto__=AA)
// let obj = {};
// obj.__proto__ = Fn.prototype;
let obj = Object.create(Fn.prototype);
Fn.call(obj, ...arg);
return obj;
}
let zhangsan = _new(Dog, ‘张三‘);
zhangsan.bark();
zhangsan.sayName();
console.log(zhangsan instanceof Dog);