理解javascript中的原型

已经熟悉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
原型和实例不是复制关系,而是协同关系!,附加到了新建立的对象上

未完待续!开发

相关文章
相关标签/搜索