在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();
阅读(434) | 评论(0) | 转发(0) |