已经熟悉Javascript的开发者可能会认为原型和对象的关系很亲密,但是这全都与函数有关,原型虽然是定义对象的一种很方便的方式,但是它的本质依然是函数特性。
作为Javascript中的一个方便方式,使用原型所定义的属性会变成实例化对象的属性,从而作为复杂对象创建的概览。
所有函数在初始化的时候都有一个prototype属性,该属性的初始值是一个空对象,只有函数在作为构造器(constructor)的时候,prototype属性才会返回更大的作用,使用new关键字调用一个函数,使得该函数可以作为构造器进行实例化,并产生一个新的空对象实例作为其上下文
上面看不懂没关系下面我们就用几个例子来理解一下原型
对象实例化
创建新对象最简单的方法只有一条语句
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';
}
上面我们演示了如何创建一个对象并为之添加三个属性,那么如果我们要创建多个相同类型的对象实例,分别对属性进行赋值,不仅代码冗长,还非常容易出错。此处下面在说
原型作为对象概览
我们先开看代码
function Person () {}
Person.prototype.dance = function () {
return true
}
var person = new Person;
console.log(person.dance())//true
让我们看看发生了什么? 使用new操作符将其作为构造器进行调用,构造函数被调用,并且新创建了一个对象也就是他的实例,新创建的函数成了构造函数的上下文,new操作符返回的结果就是对新创建的对象的引用
实例属性
使用new操作符将函数作为构造器进行调用的时候,其上下文被定义新对象实例,意味着除了通过原型给附加属性的形式意外,我们还可以在构造函数内通过this参数初始化值。
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
原型和实例不是复制关系,而是协同关系!,附加到了新创建的对象上
未完待续!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。