开局先上一张图、分清楚函数与对象:
图片描述
得到结论:对象都有_proto_这个属性,但是只有函数对象才有prototype这个属性。

得出上面结论后我们再上一张图、我们对话题研究都是基于这张图:
图片描述

根据上图,自己些代码论证一下得出一下结论:
const Foo =function(){};
const Foo_prototype = Foo.prototype;
const f1 = new Foo();
Foo.prototype == Foo.prototype //true
Foo_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是一样的吗?


一只鱼
26 声望0 粉丝

赚钱买房子