js原型理解
来源:互联网 发布:淘宝货源 知乎 编辑:程序博客网 时间:2024/06/11 03:22
做程序不仅要知其然,更要知其所以然!
原型是Js中非常重要的概念,每个函数(在Js里面函数也是对象)都有一个叫prototype(即原型)的属性,不过在一般情况下它的值都是null,但是它有一项非常重要的功能就是所有实例都会共享它里面的属性和方法(这就是Js里面实现继承的基础)!
还是举例吧:
function auth(){
alert(this.name);
//此处一定要加this关键字
}
auth.prototype.name='shiran';//这句可以放到对象定义之后,但必须在被调用之前
new auth();//这里一定要用new
这里需要注意三点:
第一、name前面一定要加关键字this,不然的话就会得不到任何值,因为如果你不加this,他就不会到原型中查找(加上this是属性它会在上下文查找,看看前面我讲的变量的查找那一章)。
第二、如果实例对象在对象中找不到属性或方法就会到对象的prototype中去查找,所以如果想在函数被调用的时候调用对象的属性或方法,就必须把调用语句放在prototype定义之后(在这里,就是new auth必须放到auth.prototype.name之后)!
第三、只有实例对象才会到原型中查找,因为对于原对象来说prototype是他的属性必需通过prototype才能访问(在这里,要用new auth()生成一个实例,而不能用auth)!
原型对于对象的实例来说是共享的,这既给程序带来方便,同时也会让人感到迷惑,出现好多让人意想不到的结果!
auth=function(){ };
auth.prototype={
name:[],
getNameLen:function(){
alert(this.name.length);
},
setName:function(n){
this.name.push(n);
}
}
var lwx=new auth();
lwx.setName('lwx');
lwx.getNameLen();
var shiran=new auth();
shiran.setName('shiran');
shiran.getNameLen();
第二次弹出的对话框显示name的长度已经是2,为什么呢?这就是原型的共享引起的,因为变量lwx和shiran都是auth对象,而且name属性是在auth对象的原型中定义的,所以lwx和shiran实例之间共享name这个属性!!可是这并不是我们想要看到的结果,因为我们希望,每个实例之间是相互隔离的。
这里我们可以把name属性从原型中去掉,放在auth对象的定义中即:
auth=function(){
this.name=[];//切记,一定要在前面加上this关键词
};
这样一来,每个auth的实例都会拥有自己的name属性!
所以推荐大家,以后在定义对象的时候:把属性放到定义里,而把对象的方法放到原型里!
- js原型理解
- js原型对象理解
- JS原型--初理解
- JS原型理解
- 理解js中原型
- JS 原型理解
- js中的原型理解
- js原型的理解
- js原型的理解
- 理解 js 原型
- 理解js原型和原型链
- JS原型、原型链深入理解
- JS原型、原型链深入理解
- js原型与原型链的理解
- JS原型、原型链深入理解
- 深入理解js原型与原型链
- JS-原型对象的理解
- 理解js中的原型链
- Oracle分页查询语句(六)
- Oracle分页查询语句(七)
- 与我相亲的剩女竟然是个小三
- 把握趋势,把握未来 —- 小评《只有偏执狂才能生存》
- (找工作的同学注意了!)签offer和三方的区别和注意
- js原型理解
- 西雅图十大最具潜质初创公司盘点
- 工厂方法(Factory Method) -- (模式之八)
- Eclipse plugin插件安装
- 寻找发帖“水王”--《编程之美》笔记
- 数据存储的字节顺序
- android布局基础及范例(一):QQ登陆界面设计
- 中文乱码(编码解码)问题的解决办法【转】
- 强烈推荐:240多个jQuery插件