一次面试

继承

继承?
-.-

为神马要继承?
算法优化,语法概念,底层'架构'...
实例对象的共享优化,通过指针的方式,减少内存开支

prototype

prototype什么鬼?
菊花链

有什么作用?
js继承的实现依赖
函数通过prototype获取到公共的属性/方法,以达到继承的目的

so?
js的继承通过prototype的指向直接增加一层(菊花链),不在进行其他优化,在创建对象时,需要对该链不断的进行循环查找,直到找到

constructor

constructor什么鬼,函数本身不就是构造函数吗?
构造函数,prototype只是静态的菊花链,函数本身是构造函数,而constructor是构造函数的指向
理论上是自动产生,不应该被修改的,创建对象语法不健全下,可以被修改
单纯的识别属性,可以想到,好的api都会提供很全面的属性
(java有道题,如何获取祖宗属性,如何获取构造函数,在js中,这都不是事)

__proto__

__proto__是神马?
构造该对象的原型(当前对象的原型)
通过构造函数创建出来的实例,均包含此属性

为什么是该对象的原型?
function A(){}
A.prototype.a=1;
A.prototype.click=function(){console.log(1)};
var a=new A();
console.log(a.__proto__===A.prototype)//true

function B(){}
B.prototype=new A();
var b=new B()

console.log(b.__proto__===B.prototype)//true

a上的prototype是什么?
函数才有prototype属性,也才有继承的意义
通过构造函数创建出来的a,没有prototype

所以构造函数出来的对象一定没有prototype,那为什么还要用__proto__代替?
function A(){
return function(){}
}
var a=new A();
console.log(a.prototype);
console.log(a.__proto__);
构造函数不完善(或者说基于万物皆对象的准则),通过构造函数创建出的对象也可能包含prototype,
所以__proto__的意义并不能被替代
换言之,__proto__是实例的菊花链
prototype是函数的菊花链


低版本ie下没有__proto__?
非标准,且暴露危险

chrome下为什么有?
ued,方便程序猿通过实例查看继承关系,且改了也没用

而且es6对其有了明确的定义
__proto__属性,用来读取或设置当前对象的prototype对象。只有浏览器需要实现这个属性

抑郁了,早知道写博文,直接把地址丢面试官脸上的

原文地址:https://www.cnblogs.com/liuCy/p/4924108.html