js原型 prototype

 js原型是Js中非常重要的概念,每个函数(Js里面函数也是对象)都有一个叫prototype(即原型)的属性,不过在一般情况下它的值都是null,但是它有一项非常重要的功能就是所有实例都会共享它里面的属性和方法(这就是Js里面实现继承的基础)

  原型与原型链 体现OOP思想.

原型使用方式1:

 

Js代码   收藏代码
  1.  var Calculator = function (decimalDigits, tax) {                                           
  2.        this.decimalDigits = decimalDigits;      
  3.         this.tax = tax;        
  4.   };  
  5.   
  6.  Calculator.prototype = {           
  7.    add: function (x, y) {     
  8.              return x + y;            
  9.   },         
  10.      subtract: function (x, y) {     
  11.              return x - y;             
  12.  }        };        
  13.   
  14. //测试  
  15. var obj=new Calculator();  
  16.  alert(obj.add(1, 3));  

 Calculator对象的prototype属性赋值对象字面量来设定Calculator对象的原型。
 

 原型使用方式2:

赋值原型prototype的时候使用function立即执行的表达式来赋值。

Js代码   收藏代码
  1. Calculator.prototype = function () {   
  2.   
  3. } ();  

 

 封装私有的function,通过return的形式暴露出简单的使用名称,以达到public/private的效果 。

Js代码   收藏代码
  1. Calculator.prototype = function () {      
  2.         add = function (x, y) {       
  3.            return x + y;             
  4.  },             
  5.  subtract = function (x, y) {     
  6.              return x - y;           
  7.    }            
  8.   return {            
  9.       add: add,        
  10.        subtract: subtract    
  11.           }        } ();        
  12.   
  13. //测试  
  14. var obj=new Calculator();  
  15. alert(obj.add(11,3));  

 

分步声明:

Js代码   收藏代码
  1. var BaseCalculator = function () {    
  2.   //为每个实例都声明一个小数位数    
  3.   this.decimalDigits = 2;  
  4. };       
  5.    //使用原型给BaseCalculator扩展2个对象方法  
  6. BaseCalculator.prototype.add = function (x, y) {    
  7.   return x + y;  
  8. };  
  9. BaseCalculator.prototype.subtract = function (x, y) {   
  10.    return x - y;  
  11. };  

 

首先,声明了一个BaseCalculator对象,构造函数里会初始化一个小数位数的属性decimalDigits,然后通过原型属性设置2个function,分别是add(x,y)和subtract(x,y),当然你也可以使用前面提到的2种方式的任何一种,我们的主要目的是看如何将BaseCalculator对象设置到真正的Calculator的原型上。

 

Js代码   收藏代码
  1. var BaseCalculator = function() {     
  2.  this.decimalDigits = 2;  
  3. };  
  4. BaseCalculator.prototype = {    
  5.   add: function(x, y) {    
  6.       return x + y;      
  7. },    subtract: function(x, y) {   
  8.        return x - y;     
  9.  }};  

 

Js代码   收藏代码
  1. var Calculator = function () {    
  2.   //为每个实例都声明一个税收数字    
  3.   this.tax = 5;  
  4. };        
  5.   Calculator.prototype = new BaseCalculator();  

 

我们可以看到Calculator的原型是指向到BaseCalculator的一个实例上,目的是让Calculator集成它的add(x,y)和subtract(x,y)这2个function,还有一点要说的是,由于它的原型是BaseCalculator的一个实例,所以不管你创建多少个Calculator对象实例,他们的原型指向的都是同一个实例。

Js代码   收藏代码
  1. var calc = new Calculator();  
  2. alert(calc.add(1, 1));  
  3. //BaseCalculator 里声明的decimalDigits属性,在 Calculator里是可以访问到的alert(calc.decimalDigits);   

 

上面的代码,运行以后,我们可以看到因为Calculator的原型是指向BaseCalculator的实例上的,所以可以访问他的decimalDigits属性值,那如果我不想让Calculator访问BaseCalculator的构造函数里声明的属性值,这样处理

Js代码   收藏代码
  1. var Calculator = function () {   
  2.    this.tax= 5;  
  3. };  
  4. Calculator.prototype = BaseCalculator.prototype;  

 

通过将BaseCalculator的原型赋给Calculator的原型,这样你在Calculator的实例上就访问不到那个decimalDigits值了,如果你访问如下代码,那将会提升出错。

Js代码   收藏代码
  1. var calc = new Calculator();  
  2. alert(calc.add(1, 1));  
  3. alert(calc.decimalDigits);  

 

重写原型: 

 在使用第三方JS类库的时候,往往有时候他们定义的原型方法是不能满足我们的需要,但是又离不开这个类库,所以这时候我们就需要重写他们的原型中的一个或者多个属性或function,我们可以通过继续声明的同样的add代码的形式来达到覆盖重写前面的add功能。

Js代码   收藏代码
  1. //覆盖前面Calculator的add() function   
  2. Calculator.prototype.add = function (x, y) {    
  3.   return x + y + this.tax;  
  4. };  
  5. var calc = new Calculator();  
  6. alert(calc.add(1, 1));  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值