题目
function Dog(name) {
this.name = name;
}
Dog.prototype.bark = function () {
console.log('wangwang');
}
Dog.prototype.sayName = function () {
console.log('my name is ' + this.name);
}
/*
let sanmao = new Dog('三毛');
sanmao.bark();
sanmao.sayName();
*/
function _new () {
// 完成你的代码
}
let sanmao = _new(Dog, '三毛');
sanmao.bark(); //=>"wangwang"
sanmao.sayName(); //=>"my name is 三毛"
console.log(sanmao instanceof Dog); //=>true
实现 _new
// Func要操作的这个类(最后要创建这个类的实例)
// ARGS存储未来传递给Func类的实参
function _new(Func, ...args) {
// 1.创建一个FUNC的实例对象(实例.__proto__=>类.prototype)
// 在IE浏览器中,禁止我们使用__proto__(也可以理解为IE并没有提供给我们__proto__这个属性,防止我们去改变原型指向)
/* 不兼容IE
let obj = {};
obj.__proto__ = Func.prototype;
*/
let obj = Object.create(Func.prototype);
// 2.把FUNC当做普通函数执行(让方法中的THIS指向创建的实例)
let result = Func.call(obj, ...args);
// 3.分析函数执行的返回值(没有返回值或者返回的是原始值类型则默认都返回创建的实例,否则以函数自身返回的为主)
if (result !== null && /^(object|function)$/.test(typeof result)) {
return result;
}
return obj;
}
实现 Object.create()
Object.create([OBJECT]) 原理:
创建一个空对象x,并且把[OBJECT](这个值需要是一个对象)作为新对象的原型指向x.__proto__=[OBJECT]
特例:Object.create(null):创建一个没有原型/原型链的空对象(不是任何类的实例)
// 我们写的这个方法不支持null的处理
Object.create = function create(prototype) {
if (prototype === null || typeof prototype !== "object") {
throw new TypeError(`Object prototype may only be an Object: ${prototype}`);
}
// 创建一个类,创建这个类的实例,实例.__proto__=类.prototype;而我们让类.prototype等于传递的 prototype;
function Temp() {}
Temp.prototype = prototype;
return new Temp;
};