es5 new的创建实例具体实现
function Animal(name){
this.name = name;
return `你好,我是` + this.name ;
}
let a = new Animal('程序猿'); //下面将讲解具体创建实例
1、创建一个新的空对象。(即实例对象)
obj = {}
2 、设 置 原 型 链
将新对象obj的 __proto__属性指向构造函数的prototype 对象。(即所有实例对象通过__proto__可 以访问原型对象。构造函数的原型被其所有实例对象共享。)
obj.__proto__= Animal.prototype
3 、将构造函数的thi s改指向新对象ob j并 执行函数代码。
(即给实例对象设置属性 name 并赋值。)
var result = Animal.apply(obj,['程序猿'])
4 、如果构造函数中没有人为返回一个对象 类型的值,则返回这个新对象obj。否则直 接返回那个对象类型值。(一般定义的构造 函数中不写返回值。)
if (typeof(result) == 'object') {
return result;
}else{
return obj;
}
5、整合
function Animal(name){
this.name = name;
return `你好,我是` + this.name ;
};
function newFun() {
var obj = {};
Constructor = [].shift.call(arguments);
obj.__proto__ = Constructor.prototype;
var ret = Constructor.apply(obj, arguments);
return typeof ret === 'object' ? ret: obj;
};
let a = newFun(Animal, '程序猿');
a.name; //\程序猿 因为Animal返回的是String即返回Object对象
转载原文链接:https://blog.csdn.net/qq_32442973/article/details/119856668