资源描述:
《javascript中的prototype原型学习指南_基础知识》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、JavaScript中的prototype原型学习指原型是什么Function类型有一个屈性prototype,直接翻译过來就是原型。这个屈性就是一个指针,指向一个对彖,这个对象包含一些屈性和方法,这些屈性和方法会被当前函数生成的所有实例(对彖)所共享。这句话根据前面所说的,细细琢磨下来,就可以得到下面代码:functionPerson(){•••}Person.prototype={country:'china',sayName:function(){•••}}先创建了一个Function类型的实例person,然后person的方法p
2、rototype是一个对象,就声明指向了一个对象。这个对象里面的展性和方法,会被当前person函数生成的实例所共享。也就是说:personl二newPerson();person2二newPerson();pcrsonl和pcrson2都是通过Person这个Function类型实例,再次生成的实例,它们俩都有共同的属性country和方法sayName,因为它们都有某个指针(—proto_),直接指向Person,prototype所指向的对象。不过要注意—proto_这个指针是不标准的,只有Chrome和Firefox等浏览器自己定
3、义的,实际中,也不会用到这个属性,只是作为理解prototype來用:>personl._proto_►Object{country:usajdflja11,sayName:function}>person2._proto_►Object{country:ltsajdflja11,sayName:function}>personl._proto_==person2._proto_true>personl._proto_==Person.prototypetrue>关于原型等用法,后面会更具体的讲到。创建对象的模式卜•面,我们就來看卜•创建
4、对象的方法和常用模式,以及它们Z间的优缺点。1.工厂模式就像工厂一样,抽彖了创建具体对象的过程,用函数来封装以特定接口创建对象的细节。通过使用函数代替部分重复工作,代码如下:functioncrcatcPcrson(name,age,job){varo=newObject();o.name=name;o.age二age;o.job二job;o.sayNamc=function(){alert(this・name);};returno;}varpersonl=crcatcPcrson(,zjiangshui","22","cnginccr〃
5、);这样就创建岀来了一个人,工厂模式解决了多个相似对象重复创建问题,但是没有解决对象识别问题。只是单纯的创建了一个对象,而不管这个对象是从人类模版还是动物模版创建的,无法区分这个对象的类型。2.构造函数模式创建一个口定义的构造函数,从而定义口定义对象类型的屈性和方法。functionPerson(name,age,job){this.name二name;this.age二age;this・job=jpb;this・sayNamc=function(){alert(this・name);};};varpersonl二newPerson(..
6、.);1.构造函数模式与工厂模式区别:•没有显式的创建对象。•肓接将属性和方法赋值this对象。•没有return语句。Person是Function类型的对象,new之后,会继续产生一个对象,但这个新产生的对象,由于在函数中传递进去参数,并赋值给了this指针,那么传递进去的内容,就变成了新产生对彖的屈性或方法。构造函数默认习惯是首字母大写,上面代码执行经丿力了下面儿个步骤:•创建一个新对象•将构造函数作用域赋值给新对彖•执行构造函数中的代码•返回新对象这样生成的实例中,都默认包含一个constructor属性指向构造函数,例如:ale
7、rt(personl.constructor==Person);所以用构造函数模式,冇类型的区分,可以将它的实例标识为一种特定的类型。此外,构造函数就是普通的函数,因为要反馈得到新对彖,所以用new来调用。如果不用的话,直接执行就跟普通函数一样,例如上面,执行Person.sayName()会弹出window,name,因为函数在window下面执行,所以this指向window。构造函数模式也是有缺陷的,构造函数模式里面的方法,在每个实例上都重新创建了一遍,因此不同实例上的同名函数是不相等的。例如:personl.sayName==pe
8、rson2.sayName;//false也就是说,由构造函数生成的每个对彖实例,屈性和方法都是独冇的,都是复制了一遍。属性独有是必须的,因为这正是对象之间不同的地方,但是很多方法功能和代码都