prototype属性可算是JavaScript与其他面向对象语言的一大不同之处。 prototype就是“一个给类的对象添加方法的方法”,使用prototype属性,可以给类动态地添加方法,以便在JavaScript中实现“继承”的效果。  


 具体来说,prototype 是在 IE 4 及其以后版本引入的一个针对于某一类的对象的方法,当你用prototype编写一个类后,如果new一个新的对象,浏览器会自动把prototype中的内容替你附加在对象上。这样,通过利用prototype就可以在JavaScript中实现成员函数的定义,甚至是“继承”的效果。


对于javascript本身而言是基于对象的,任何元素都可以看成对象。然而类型和对象是不同的,而我们所讲的prototype属性即是基于类型的一种属性。对于prototype的基本使用就如对象的创建及属性赋值一样的简单。直接通过赋值操作即可完成属性的创建。


关于prototype,理解这个很有必要        

1. 可以在类型上使用proptotype来为类型添加行为。这些行为只能在类型的实例上体现。     

2.  JS中允许的类型有Array, Boolean, Date, Enumerator, Error, Function, Number, Object, RegExp, String        

              3.  以后这样分,没有实例化的类称为类型,实例化的类称为对象实例简称实例      



以下是一些关于类型和对象的例子,大家看完例子后可能更容易理解类型和对象之间的联系:


 


 

例子代码

说明

1

Object.prototype.Property = 1;
Object.prototype.Method = function ()



{



    alert(1);



}



 



var obj = new Object();



alert(obj.Property);



obj.Method();

可以在类型上使用proptotype来为类型添加行为。这些行为只能在类型的实例上体现。

JS中允许的类型有Array, Boolean, Date, Enumerator, Error, Function, Number, Object, RegExp, String

2

var obj = new Object();
obj.prototype.Property = 1; //Error



//Error



obj.prototype.Method = function()



{



    alert(1);



}

在实例上不能使用prototype,否则发生编译错误

3

Object.Property = 1;



Object.Method = function()



{



    alert(1);



}



 



alert(Object.Property);



Object.Method();

可以为类型定义“静态”的属性和方法,直接在类型上调用即可

4

Object.Property = 1;



Object.Method = function()



{



    alert(1);



}



var obj = new Object();



alert(obj.Property); //Error



obj.Method(); //Error

实例不能调用类型的静态属性或方法,否则发生对象未定义的错误。

5

function Aclass()



{



this.Property = 1;



this.Method = function()



{



    alert(1);



}



}



var obj = new Aclass();



alert(obj.Property);



obj.Method();

这个例子演示了通常的在JavaScript中定义一个类型的方法

6

function Aclass()



{



this.Property = 1;



this.Method = function()



{



    alert(1);



}



}



Aclass.prototype.Property2 = 2;



Aclass.prototype.Method2 = function



{



    alert(2);



}



var obj = new Aclass();



alert(obj.Property2);



obj.Method2();

可以在外部使用prototype为自定义的类型添加属性和方法。

7

function Aclass()



{



this.Property = 1;



this.Method = function()



{



    alert(1);



}



}



Aclass.prototype.Property = 2;



Aclass.prototype.Method = function



{



    alert(2);



}



var obj = new Aclass();



alert(obj.Property);



obj.Method();

在外部不能通过prototype改变自定义类型的属性或方法。



该例子可以看到:调用的属性和方法仍是最初定义的结果。

8

function Aclass()



{



this.Property = 1;



this.Method = function()



{



    alert(1);



}



}



var obj = new Aclass();



obj.Property = 2;



obj.Method = function()



{



    alert(2);



}



alert(obj.Property);



obj.Method();

可以在对象上改变属性。(这个是肯定的)



也可以在对象上改变方法。(和普遍的面向对象的概念不同)

9

function Aclass()



{



this.Property = 1;



this.Method = function()



{



    alert(1);



}



}



var obj = new Aclass();



obj.Property2 = 2;



obj.Method2 = function()



{



    alert(2);



}



alert(obj.Property2);



obj.Method2();

可以在对象上增加属性或方法

10

function AClass()



{



       this.Property = 1;



       this.Method = function()



       {



              alert(1);



       }



}



 



function AClass2()



{



       this.Property2 = 2;



       this.Method2 = function()



       {



              alert(2);



       }



}



AClass2.prototype = new AClass();



 



var obj = new AClass2();



alert(obj.Property);



obj.Method();



alert(obj.Property2);



obj.Method2();

这个例子说明了一个类型如何从另一个类型继承。

11

function AClass()



{



       this.Property = 1;



       this.Method = function()



       {



              alert(1);



       }



}



 



function AClass2()



{



       this.Property2 = 2;



       this.Method2 = function()



       {



              alert(2);



       }



}



AClass2.prototype = new AClass();



AClass2.prototype.Property = 3;



AClass2.prototype.Method = function()



{



       alert(4);



}



var obj = new AClass2();



alert(obj.Property);



obj.Method();

这个例子说明了子类如何重写父类的属性或方法。

 

   以上例子中,关于通过类型实现重用方面,重要的有:

·例子1:JavaScript中允许添加行为的类型

·例子2:prototype使用的限制

·例子3:如何定义类型上的静态成员

·例子7:prototype在重定义类型的成员上的限制

·例子10:如何让一个类型继承于另一个类型

·例子11:如何在子类中重新定义父类的成员

例子:

Object.prototype.name = "zhangsan";         Object.prototype.nihao = function(){             alert("i can method name is "+this.name);         }         var obj = new Object();         obj.nihao();         alert(obj.name);

例子:

//在实例上不能使用prototype,否则会发生编译错误         obj.prototype.sex = "男";//error,无法给一个实例prototype         var o = {             name:"zhangsan"         }         o.prototype.age = 30;//error,无法给一个实例prototype
//可以在外部使用prototype为自定义的类型添加属性和方法。         function Mytest(){             this.name = "zhangsan";             this.age = 20;         }         Mytest.prototype.hello = function(){             alert(this.name);         }         var m = new Mytest();         m.hello();

//在外部不能通过prototype改变自定义类型的属性或方法。

//该例子可以看到:调用的属性和方法仍是最初定义的结果。

        var mm = new Mytest();         alert(mm.name);     // zhangsan

 //继承,这个例子说明了一个类型如何从另一个类型继承。

// //这个例子说明了子类如何重写父类的属性或方法

子类中的name属性值不会被父类覆盖

var baseLocalStorageClass = function(){
    this.name = "zcy";
    this.pass="1234556";
    this.f1 = function(){
        console.log("asd");
    }
};
var LocalStorageClass = function(){

};
LocalStorageClass.prototype = new baseLocalStorageClass ;
LocalStorageClass.prototype.name="sss";
var ll = new LocalStorageClass;
consoel.log(ll.name);//sss
consoel.log(ll.pass);//1234556ll.f1; //asd
例子1:注意this,是Array对象
Array.prototype.find = function (item) {
    for(var i=0; i<this.length;i++){
        if(this[i]==item){
            return item;
        }
    }
    return null;
}

var a = new Array();
a.push("a1");
a.push("a2");
a.push("a3");
a.push("a4");
console.log(a.find("a5"));