继承
继承?
-.-
为神马要继承?
算法优化,语法概念,底层'架构'...
实例对象的共享优化,通过指针的方式,减少内存开支
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对象。只有浏览器需要实现这个属性
抑郁了,早知道写博文,直接把地址丢面试官脸上的