JavaScript中prototype用法详解:原型链、继承与扩展内置对象

作者:函数茶馆

时间:2026-10-27

浏览:449

本文深入解析JavaScript中prototype属性的核心用法。通过Number、String、Array等内置对象的扩展实例,演示如何添加新方法;详细讲解利用prototype实现类继承、重写父类成员及定义静态成员的机制,并结合代码示例说明原型链在面向对象编程中的实际应用与限制。

文章目录

JavaScript prototype 基础概念

prototype 是 JavaScript 中自 IE 4 版本起引入的一个针对特定类对象的方法,其核心功能在于为类的对象添加新方法。这听起来可能有些抽象,下面将通过具体实例进行详细讲解。

首先,我们需要理解类的概念。JavaScript 作为一门面向对象的语言,其涉及的元素根据其属性不同,都依附于特定的类。常见的类包括:数组变量 (Array)、逻辑变量 (Boolean)、日期变量 (Date)、结构变量 (Function)、数值变量 (Number)、对象变量 (Object)、字符串变量 (String) 等。这些类的方法也是程序员经常使用的(这里需要区分类的属性和方法),例如数组的 push 方法、日期的 get 系列方法、字符串的 split 方法等。但在实际编程中,可能会感到现有方法的不足,prototype 方法应运而生。下面将通过实例由浅入深地讲解 prototype 的具体使用方法。

prototype 扩展内置对象示例

1、最简单的例子,了解 prototype:

(1) Number.add(num):作用,数字相加

实现方法:Number.prototype.add = function(num){return(this+num);} 试验:alert((3).add(15)) -> 显示 18

(2) Boolean.rev(): 作用,布尔变量取反

实现方法:Boolean.prototype.rev = function(){return(!this);} 试验:alert((true).rev()) -> 显示 false

是不是很简单?这一节仅仅是告诉读者又这么一种方法,这种方法是这样运用的。

2、已有方法的实现和增强,初识 prototype:

(1) Array.push(new_element) 作用:在数组末尾加入一个新的元素 实现方法:

代码如下:

Array.prototype.push = function(new_element){
this[this.length]=new_element;
return this.length;
     }

让我们进一步来增强他,让他可以一次增加多个元素! 实现方法:

代码如下:

Array.prototype.pushPro = function() {
var currentLength = this.length;
for (var i = 0; i < arguments.length; i++) {
this[currentLength + i] = arguments[i];
         }
return this.length;
     }

应该不难看懂吧?以此类推,你可以考虑一下如何通过增强 Array.pop 来实现删除任意位置,任意多个元素(具体代码就不再细说了)

(2) String.length 作用:这实际上是 String 类的一个属性,但是由于 JavaScript 将全角、半角均视为是一个字符,在一些实际运用中可能会造成一定的问题,现在我们通过 prototype 来弥补这部不足。 实现方法:

代码如下:

String.prototype.cnLength = function(){
var arr=this.match(/[^\x00-\xff]/ig);
return this.length+(arr==null?0:arr.length);
     }

试验:alert("EaseWe空间Spaces".cnLength()) -> 显示 16 这里用到了一些正则表达式的方法和全角字符的编码原理,由于属于另两个比较大的类别,本文不加说明,请参考相关材料。

3、新功能的实现,深入 prototype:在实际编程中所用到的肯定不只是已有方法的增强,更多的实行的功能的要求,下面我就举两个用 prototype 解决实际问题的例子:

(1) String.left() 问题:用过 vb 的应该都知道left函数,从字符串左边取 n 个字符,但是不足是将全角、半角均视为是一个字符,造成在中英文混排的版面中不能截取等长的字符串 作用:从字符串左边截取 n 个字符,并支持全角半角字符的区分 实现方法:

代码如下:

String.prototype.left = function(num,mode){
if(!/\d+/.test(num))return(this);
var str = this.substr(0,num);
if(!mode) return str;
var n = str.Tlength() - str.length;
num = num - parseInt(n/2);
return this.substr(0,num);
     }

试验: alert("EaseWe空间Spaces".left(8)) -> 显示 EaseWe空间 alert("EaseWe空间Spaces".left(8,true)) -> 显示 EaseWe空 本方法用到了上面所提到的String.Tlength()方法,自定义方法之间也能组合出一些不错的新方法呀!

(2) Date.DayDiff() 作用:计算出两个日期型变量的间隔时间(年、月、日、周) 实现方法:

代码如下:

Date.prototype.DayDiff = function(cDate,mode){
try{
cDate.getYear();
}catch(e){
return(0);
         }
var base =60*60*24*1000;
var result = Math.abs(this - cDate);
switch(mode){
case "y":
result/=base*365;
break;
case "m":
result/=base*365/12;
break;
case "w":
result/=base*7;
break;
default:
result/=base;
break;
         }
return(Math.floor(result));
     }

试验:alert((new Date()).DayDiff((new Date(2002,0,1)))) -> 显示 329 alert((new Date()).DayDiff((new Date(2002,0,1)),"m")) -> 显示 10 当然,也可以进一步扩充,得出响应的小时、分钟,甚至是秒。

(3) Number.fact() 作用:某一数字的阶乘 实现方法:

代码如下:

Number.prototype.fact=function(){
var num = Math.floor(this);
if(num<0)return NaN;
if(num==0 || num==1)
return 1;
else
return (num*(num-1).fact());
     }

试验:alert((4).fact()) -> 显示 24 这个方法主要是说明了递归的方法在 prototype 方法中也是可行的!

prototype 在面向对象编程中的应用

JavaScript能够实现的面向对象的特征有: ·公有属性(public field) ·公有方法(public Method) ·私有属性(private field) ·私有方法(private field) ·方法重载(method overload) ·构造函数(constructor) ·事件(event) ·单一继承(single inherit) ·子类重写父类的属性或方法(override) ·静态属性或方法(static member)

例子一(JavaScript中允许添加行为的类型):可以在类型上使用proptotype来为类型添加行为。这些行为只能在类型的实例上体现。 JS中允许的类型有Array, Boolean, Date, Enumerator, Error, Function, Number, Object, RegExp, String

代码如下:

<script type="text/javascript">
Object.prototype.Property = 1;
Object.prototype.Method = function ()
{   
alert(1);
}   
var obj = new Object();
alert(obj.Property);
obj.Method();
</script>
<script type="text/javascript">
Object.prototype.Property = 1;
Object.prototype.Method = function (){ alert(1);}
var obj = new Object();
alert(obj.Property);
obj.Method();
</script>

例子二(prototype使用的限制):在实例上不能使用prototype,否则发生编译错误


代码如下:

<script type="text/javascript">
var obj = new Object();
obj.prototype.Property = 1; //Error
//Error
obj.prototype.Method = function()
{   
alert(1);
}   
</script>
<script type="text/javascript">var obj = new Object();obj.prototype.Property = 1; //Error//Errorobj.prototype.Method = function(){ alert(1);}</script>

例子三(如何定义类型上的静态成员):可以为类型定义“静态”的属性和方法,直接在类型上调用即可


代码如下:

<script type="text/javascript">
Object.Property = 1;
Object.Method = function()
{   
alert(1);
}   
alert(Object.Property);
Object.Method();
</script>
<script type="text/javascript">Object.Property = 1;Object.Method = function(){ alert(1);} alert(Object.Property);Object.Method();</script>

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


代码如下:

<script type="text/javascript">
function Aclass()
{   
this.Property = 1;
this.Method = function()
{   
alert(1);
}   
}   
var obj = new Aclass();
alert(obj.Property);
obj.Method();
</script>
<script type="text/javascript">function Aclass(){this.Property = 1;this.Method = function(){ alert(1);}}var obj = new Aclass();alert(obj.Property);obj.Method();</script>

例子六(JavaScript中允许添加行为的类型):可以在外部使用prototype为自定义的类型添加属性和方法。


代码如下:

<script type="text/javascript">
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();
</script>
<script type="text/javascript">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();</script>

例子八():可以在对象上改变属性。(这个是肯定的)也可以在对象上改变方法。(和普遍的面向对象的概念不同)


代码如下:

<script type="text/javascript">
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();
</script>
<script type="text/javascript">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();</script>

例子九():可以在对象上增加属性或方法


代码如下:

<script type="text/javascript">
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();
</script>
<script type="text/javascript">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();</script>

例子十(如何让一个类型继承于另一个类型):这个例子说明了一个类型如何从另一个类型继承。


代码如下:

<script type="text/javascript">
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();
</script>
<script type="text/javascript">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();</script>

例子十一(如何在子类中重新定义父类的成员):这个例子说明了子类如何重写父类的属性或方法。


代码如下:

<script type="text/javascript">
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();
</script>

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章