开局先上一张图、分清楚函数与对象:
得到结论:对象都有_proto_这个属性,但是只有函数对象才有prototype这个属性。得出上面结论后我们再上一张图、我们对话题研究都是基于这张图:
根据上图,自己些代码论证一下得出一下结论:const Foo =function(){};const Foo_prototype = Foo.prototype;const f1 = new Foo();Foo.prototype == Foo.prototype //trueFoo_prototype.constructor == Foo //true//1得出结论,Foo是一个函数对象,Foo的原型Foo_prototype的构造函数就是Foo本身f1.__proto__ == Foo.prototype // true//2得出结论,foo的实例指向f1的原型链上一个节点也就是Foo的原型Foo_prototype.__proto__ == Object;//true//3得出结论,Foo原型指向Foo的上一个原型节点const Object_prototype = Object.prototype;Object_prototype.__proto__ == null//true//4得出结论,Object的原型链上一个节点是null,这也就是万物皆对象,null中生对象const Function_prototype = Function.prototype;Object.__proto__ == Function_prototype//true//5得出结论,原生对象指向Function的原型,Function.__proto__ == Function_prototype;//true//6得出结论,Function的原型链的上一个节点是Function本身Foo.__proto__ == Function_prototype//true//7得出结论,Foo的原型链上一个节点指向Function
**经过上述代码验证得出如下结论:
1.所有对象都有_proto_这个属性。2.所有的原型对象都有constructor属性,该属性对应创建所有指向该原型的实例的构造函数。3.原型链的顶端是null。****4.对象本身的prototype和_proto_毫无关系,_proto_指向原型链上一个节点的原型。
5.Function的原型链的上一个节点是Function本身(这个很奇怪哎)。**OK,抛出一个问题://通常情况下,为了只继承父函数的原型而不继承其他静态方法往往这样定义b = function(){};c = function(){};b.prototype.say = 1;c.prototype.say = 2;function extend(father,son){ var def = function(){}; def.prototype = father.prototype; son.prototype = new def();}extend(b,c)
问题:
1.继承的时候可以直接使用son.prototype = father.prototype 吗?2.为什么要新建一个def函数,然后son继承def的原型来继承呢?3.通过1方法和2方法生成的son是一样的吗?