原型链
JavaScript 中所有的对象都有一个内置属性,称为它的 prototype(原型)。它本身是一个对象,故原型对象也会有它自己的原型,逐渐构成了原型链。原型链终止于拥有 null
作为其原型的对象上
new 与原型链
new 都做了哪些事:
创建一个新的对象
继承父类原型上的方法.
添加父类的属性到新的对象上并初始化. 保存方法的执行结果.
如果执行结果有返回值并且是一个对象, 返回执行的结果, 否则, 返回新创建的对象。
function _new(obj, ...rest){
// 基于obj的原型创建一个新的对象
const newObj = Object.create(obj.prototype);
// 将newObj作为函数内部的this上下文,并将rest数组中的元素作为参数传递给这个函数, 并获取obj函数执行的结果
const result = obj.apply(newObj, rest);
// 如果执行结果有返回值并且是一个对象, 返回执行的结果, 否则, 返回新创建的对象
return typeof result === 'object' ? result : newObj;
}
this 与原型链
function a() {this.b = 3;}
var c = new a();//创建了c,c是a的实例
a.prototype.b = 9;//为a函数的prototype原型上添加了b,并将他设置为9
var b = 7;
a();
//优先级实例自身>原型,在 a 的构造函数中,将 b 设置为了 3,因此对原型链的设置不起作用了
//浏览器中this指向window,因此全局的b被设置成了3,nodejs中this指向window,而b是局部作用域的值
console.log(b);
console.log(c.b);//
nodejs(Vscode) 输出:7,3
浏览器输出:3,3
在调用函数 a 时的 this 指向全局的 b ,因此全局 b 被设置为3
在创建 c 时,c 中的 b 是 3.
Last updated