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();
|
这个例子说明了子类如何重写父类的属性或方法。
|
例子:
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改变自定义类型的属性或方法。
//该例子可以看到:调用的属性和方法仍是最初定义的结果。
Mytest.prototype.name = "lisi";
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"));