原型和原型链
原型和原型链是JS的基础,虽然即使不懂其所以然,对正常的板砖写代码也没什么影响,特别是现在框架横行的时代。好像学会一个框架就可以解决所有需求,答案好像是的,本人也很长时间也没去弄懂原型和原型链,压根好像觉得这些都是多余的属性。也正是证实了那句话,无知者无畏,越是深入学习越是觉得自己渺小,对待技术也就越小心翼翼。原型和原型链是JS中面向对象程序设计的基础,即使在es6中出现了class 但是其并不是真正的 类的概念,而是原型的语法糖。如果想深入学习JS成为大神原型和原型链是必须要经过众多坑之一。
什么是原型对象:为其他对象提供共享属性的对象。
(当构造器创建一个对象,为了解决对象的属性引用,该对象会隐式引用构造器的“prototype”属性。通过程序表达式 constructor.prototype 可以引用到构造器的“prototype”属性,并且添加到对象原型里的属性,会通过继承与所有共享此原型的对象共享。另外,可使用 Object.create 内置函数,通过明确指定原型来创建一个新对象。)
如果想弄懂JS的原型必须要知道的几个概念:
1、构造函数
什么是构造函数:构造函数是一种特殊的方法,主要用来创建对象时的初始化对象,为对象初始化赋值。并可以接受参数来构造多个不同的对象。它总是与new运算符一起出现在构造语句中。
2、prototype
原型:javascript 对象的内置属性,它时对其他对象的引用,几乎所有对象创建时都会被赋予一个非空的prototype
3、proto
隐式原型:在构造函数的实例中出现,等同于它构造函数的prototype
4、constructor
构造器:构造函数
5、Object
对象构造器:创建一个对象有两种方式,一种是声明形式 var o = {} 一种是构造形式 var o = new Object
6、Function
函数构造器:创建函数 也分为 声明形式 和 构造形式 本身Object() ,Number (),String()等等都是函数,所以他们都是由Function构造的。
let Foo = new Function()
let f1 = new Foo()
他们之间的原型关系又是什么?
1、f1是Foo的实例他们之间靠prototype建立继承关系,靠constructor表明父子关系。在f1实例中包含一个proto属性指向Foo的prototype f1._proto_ === Foo.prototype //true 注意_proto_属性只有在chrom下才有 所以这是一个不安全的属性,可以用Foo.prototype.isPrototypeOf(f1)代替,f1的构造函数是Foo:f1.constructor === Foo // true
2、Foo和Function之间的关系,Foo是由Function构造的:Foo.constructor === Function ,Foo._proto_ === Function.prototype
3、Object和Function 之间的关系:由于Object是由Function构造的:Object.contructor === Function , 由于Object.prototype === null所以Object.prototype就是原型链的最底层。而Function是对象的一个特殊类 Function.prototype 是Function的自有原型,所以Function.prototype._proto_ === Object.prototype
这些就是完整的原型关系