原型链原型:
每一个js 对象(null除外)都会和另一个对象相关联,“另一个”对象就被我们称之为‘原型’,
而每一个原型拥有一个prototype 属性指向原型对象(就是原型的实例)的引用,
原型就是通过该prototype将自身的属性和方法共享给继承他的子对象;
子对象通过__proto__
指向原型的prototype进行属性方法继承;这种方式称之为‘原型链’
如图
- 其实Function 最特殊(函数界一等公民) 它是它自己的一个实例 ;
如:
Function(){}
let F = new Function();
Function.prototype = F;
Function.__proto__ = F;
就是说 Funciton 的原型就是F , 即Function.__proto__ === Function.prototype
,
所 Function.constructor === Function
而 Function.prototype.__proto__ === {}
,没有再指向F而是{}避免了无意义的死循环
- 而Object 也是new Function()来的,
即Object.__proto__=F
,
所Object.__proto__ === Function.prototype
而
Object.prototype ==={}
此处同Function.prototype.__proto__
同理最终他的原型对象并没有再指向F; 而是指向了最上层的{} 一个空对象,
简单分析不难得出 要是他的原型对象和原型都指向同一个那就成死循环了
即会出现Object.__proto__ = F ; F = new Object();
- 而自定义函数默认原型为 F ,即
CustFn.__proto__ === Function.prototype
以此类推他的构造函数就是Function了 即CustFn.constructor === Function
到这里 CustFn 与 其实例的关系也就好理解了,
如
let FC = new CustFn();
CustFn.prototype = FC;
而 var custfn = new CustFn(); 就如 custfn = FC;
所以 custfn.__proto__ === FC
即 custfn.__proto__ === CustFn.prototype
而CustFn.prototype 是 new CustFn();
来的那么 他的constructor 当然是 CustFn了
CustFn.prototype 是通过newCustFn() 这个普通函数来的,所以他的原型是一个{}空对象
CustFn.prototype.__proto__ === {}
到此不难理解 '只有new Function()来的函数 的原型才是Function 其的都是普通对象',如同 new Object()一样
个人能力有限,如理解有误的地方还望指点谢谢
网友评论