js原型链与new运算符
1. 原型链
勘谬:
- 链上被穿起来的是“原型”,而不是链子本身是“原型”。
- “原型”是链的对象,而不是链的材质。
- 一根绳子把“原型”串了起来,而不是指一根叫原型的绳子。
指正:
- 这条链上有节点有边,节点是prototype(“原型”),边是__proto__。
- 绳子是__proto__,原型是prototype。
图文:
图片出处:
[1] 最详尽的 JS 原型与原型链终极详解,没有「可能是」。(二)
[2] JavaScript深入之从原型到原型链
[3] js中__proto__和prototype的区别和关系?
2. new
设:a = new A();
- 只能new一个函数对象,只有函数对象才可以被new。
- A自己的属性,只有自己可以访问;A的prototype的属性,可以被a访问。所有要把想要被继承的内容放到prototype里。
出处:在《JS原型链与继承别再被问倒了》
为了追本溯源, 我顺便研究了new运算符具体干了什么?发现其实很简单,就干了三件事情.
var obj = {};
obj.proto = F.prototype;
F.call(obj);
第一行,我们创建了一个空对象obj;
第二行,我们将这个空对象的__proto__成员指向了F函数对象prototype成员对象;
第三行,我们将F函数对象的this指针替换成obj,然后再调用F函数.
我们可以这么理解: 以 new 操作符调用构造函数的时候,函数内部实际上发生以下变化:
1、创建一个空对象,并且 this 变量引用该对象,同时还继承了该函数的原型。
2、属性和方法被加入到 this 引用的对象中。
3、新创建的对象由 this 所引用,并且最后隐式的返回 this.