Chinaunix首页 | 论坛 | 博客
  • 博客访问: 465620
  • 博文数量: 226
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2111
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-20 09:02
个人简介

web web web

文章分类

全部博文(226)

文章存档

2020年(2)

2019年(1)

2018年(3)

2017年(26)

2016年(57)

2015年(60)

2014年(77)

我的朋友

分类: Web开发

2014-09-15 16:31:36

     在JS中应该要明确一点,一切继承都是通过prototype来进行的,且JS是基于对象来继承的。
    
     原型在js中非常重要,每个函数(在js里面函数也是对象)都有一个叫prototype的属性,一般情况下他的值都是null,他能共享他里面的属性和方法(也是js里面的继承基础)。
    
例子:
function auth(){ 
     alert(this.name);
         //此处一定要加this关键字
}
auth.prototype.name = 'shi';//这句可以放在对象定义之后,但必须在被调用之前
new auth();//这里一定要用new
  
需要注意三点
 第一、那么前面一定要有关键字this,如果不加this就不会到原型中查找。
第二、如果实例对象在对象中找不到属性或方法就会到对象的prototype中去查找,所以如果想在函数被调用的时候调用对象的属性或方法,就必须把调用语句放在prototype定义之后!
第三、只有实例对象才会到原型中查找,因为对于原对象来说prototype是他的属性必需prototype才能访问!
 
auth = function(){};
auth.prototype = {
      name:[],       
    getNameLength:function(){
             alert(this.name.length);   
     },
    setName:function(n){
             this.name.push(n);        
    }    
}

var one = new  auth();
one.setName("lx");
one.getNameLength();
var two = new  auth();
two.setName("to");
two.getNameLength();
   //结果:第一次弹出1,第二次弹出2
  
    第二次弹出的对话框显示name的长度是2,为什么?这就是原型共享引起的,因为变量one和two都是auth对象,而且name属性是在auth对象的原型中定义的,所以这里的one和two实例之间共享这个属性。
    我们希望实例之间相互隔离怎么办呢?
 
one.getName();
auth.prototype.name = [];
var two = new auth();

可以像这样在one.getName();和var two = new auth();之间将原型属性置为空数组,但是每次生成实例的之前都这样很麻烦,

下面就就属性name放在定义里面,而把对象的方法放在原型里面
auth= function(){
       this.name = [];//切记,一定要在前面加上this关键词
};

这样一来,每个auth的实例都会拥有自己的name属性!所以推荐在定义对象的时候把属性放在定义里,而把对象的方法放在原型里!

如下所示:
 auth = function(){
  this.name=[];
}; 

auth.prototype = {
       getNameLength:function(){
            alert(this.name.length);
       },
       setName:function(n){
            this.name.push(n);
        }
}

var one = new auth();
one.setName("lx");
one.getNameLength();

var two = new auth();
two.setName("to");
two.getNameLength();

阅读(350) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~