已经熟悉Javascript的开发者可能会认为原型和对象的关系很亲密,可是这全都与函数有关,原型虽然是定义对象的一种很方便的方式,可是它的本质依然是函数特性。
做为Javascript中的一个方便方式,使用原型所定义的属性会变成实例化对象的属性,从而做为复杂对象建立的概览。
全部函数在初始化的时候都有一个prototype属性,该属性的初始值是一个空对象,只有函数在做为构造器(constructor)的时候,prototype属性才会返回更大的做用,使用new关键字调用一个函数,使得该函数能够做为构造器进行实例化,并产生一个新的空对象实例做为其上下文
上面看不懂不要紧下面咱们就用几个例子来理解一下原型函数
建立新对象最简单的方法只有一条语句this
var o = {};//并能够为他添加一些属性 o.name = 'Li li';//添加name属性 o.age = '28'; //添加age属性 o.skill = 'english';//添加skill属性 //也能够以下面这样写\ var o { o.name = 'Li li'; o.age = '28'; o.skill = 'english'; }
上面咱们演示了如何建立一个对象并为之添加三个属性,那么若是咱们要建立多个相同类型的对象实例,分别对属性进行赋值,不只代码冗长,还很是容易出错。此处下面在说prototype
咱们先开看代码code
function Person () {} Person.prototype.dance = function () { return true } var person = new Person; console.log(person.dance())//true
让咱们看看发生了什么? 使用new操做符将其做为构造器进行调用,构造函数被调用,而且新建立了一个对象也就是他的实例,新建立的函数成了构造函数的上下文,new操做符返回的结果就是对新建立的对象的引用对象
使用new操做符将函数做为构造器进行调用的时候,其上下文被定义新对象实例,意味着除了经过原型给附加属性的形式意外,咱们还能够在构造函数内经过this参数初始化值。ip
function Person () { this.swing = false;//false this.isSwing = function() {return !this.swing}//true Person.prototype .isSwing = function(){ return this.swing } var person = new Person; console.log(person.swing) //构造函数和原型同时存在同一方法,结果会是哪一个呢?构造函数的方法优先!person会先在构造函数中找swing,若是没有在去查找原型,若是原型尚未那返回undifined 原型和实例不是复制关系,而是协同关系!,附加到了新建立的对象上
未完待续!开发