JS中的phototype是JS中比较难明白的一个部份
本文基于下面几个知识点:
1 原型法设想形式
在.Net中能够运用clone()来完成原型法
原型法的重要头脑是,如今有1个类A,我想要建立一个类B,这个类是以A为原型的,并且能举行扩大。我们称B的原型为A。
2 javascript的要领能够分为三类:
a 类要领
b 对象要领
c 原型要领
例子:
function People(name)
{
this.name=name;
//对象要领
this.Introduce=function(){
alert("My name is "+this.name);
}
}
//类要领
People.Run=function(){
alert("I can run");
}
//原型要领
People.prototype.IntroduceChinese=function(){
alert("我的名字是"+this.name);
}
//测试
var p1=new People("Windking");
p1.Introduce();
People.Run();
p1.IntroduceChinese();
3 obj1.func.call(obj)要领
意义是将obj算作obj1,挪用func要领
好了,下面一个一个题目解决:
prototype是什么寄义?
javascript中的每一个对象都有prototype属性,Javascript中对象的prototype属性的诠释是:返回对象范例原型的援用。
A.prototype = new B();
明白prototype不应把它和继续殽杂。A的prototype为B的一个实例,能够明白A将B中的要领和属性悉数克隆了一遍。A能运用B的要领和属性。这里强调的是克隆而不是继续。能够涌现这类状况:A的prototype是B的实例,同时B的prototype也是A的实例。
先看一个试验的例子:
function baseClass()
{
this.showMsg = function()
{
alert("baseClass::showMsg");
}
}
function extendClass()
{
}
extendClass.prototype = new baseClass();
var instance = new extendClass();
instance.showMsg(); // 显现baseClass::showMsg
我们起首定义了baseClass类,然后我们要定义extentClass,然则我们盘算以baseClass的一个实例为原型,来克隆的extendClass也同时包括showMsg这个对象要领。
extendClass.prototype = new baseClass()就能够浏览为:extendClass是以baseClass的一个实例为原型克隆建立的。
那末就会有一个题目,假如extendClass中自身包括有一个与baseClass的要领同名的要领会怎样?
下面是扩大试验2:
function baseClass()
{
this.showMsg = function()
{
alert("baseClass::showMsg");
}
}
function extendClass()
{
this.showMsg =function ()
{
alert("extendClass::showMsg");
}
}
extendClass.prototype = new baseClass();
var instance = new extendClass();
instance.showMsg();//显现extendClass::showMsg
试验证实:函数运转时会先去本体的函数中去找,假如找到则运转,找不到则去prototype中寻觅函数。或许能够明白为prototype不会克隆同名函数。
那末又会有一个新的题目:
假如我想运用extendClass的一个实例instance挪用baseClass的对象要领showMsg怎么办?
答案是能够运用call:
extendClass.prototype = new baseClass();
var instance = new extendClass();
var baseinstance = new baseClass();
baseinstance.showMsg.call(instance);//显现baseClass::showMsg
这里的baseinstance.showMsg.call(instance);浏览为“将instance当作baseinstance来挪用,挪用它的对象要领showMsg”
好了,这里能够有人会问,为何不必baseClass.showMsg.call(instance);
这就是对象要领和类要领的区分,我们想挪用的是baseClass的对象要领
末了,下面这个代码假如明白清楚,那末这篇文章说的就已明白了:
<script type="text/javascript">
function baseClass()
{
this.showMsg = function()
{
alert("baseClass::showMsg");
}
this.baseShowMsg = function()
{
alert("baseClass::baseShowMsg");
}
}
baseClass.showMsg = function()
{
alert("baseClass::showMsg static");
}
function extendClass()
{
this.showMsg =function ()
{
alert("extendClass::showMsg");
}
}
extendClass.showMsg = function()
{
alert("extendClass::showMsg static")
}
extendClass.prototype = new baseClass();
var instance = new extendClass();
instance.showMsg(); //显现extendClass::showMsg
instance.baseShowMsg(); //显现baseClass::baseShowMsg
instance.showMsg(); //显现extendClass::showMsg
baseClass.showMsg.call(instance);//显现baseClass::showMsg static
var baseinstance = new baseClass();
baseinstance.showMsg.call(instance);//显现baseClass::showMsg
</script>
作者:轩脉刃(yjf512)
出处:(http://www.cnblogs.com/yjf512/)
版权声明:本文的版权归作者与博客园共有。迎接转载浏览,转载时须说明本文的细致链接。