原型和原型链

原型和原型链是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 

这些就是完整的原型关系

posted @ 2018-07-24 15:45  木鱼汀  阅读(71)  评论(0编辑  收藏  举报