博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js原型理解
阅读量:4055 次
发布时间:2019-05-25

本文共 1237 字,大约阅读时间需要 4 分钟。

 程序不仅要知其然,更要知其所以然!

原型是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,为什么呢?这就是原型的共享引起的,因为变量lwxshiran都是auth对象,而且name属性是在auth对象的原型中定义的,所以lwxshiran实例之间共享name这个属性!!可是这并不是我们想要看到的结果,因为我们希望,每个实例之间是相互隔离的。
这里我们可以把name属性从原型中去掉,放在auth对象的定义中即:
auth=function(){
this.name=[];//
切记,一定要在前面加上this关键词
};
这样一来,每个auth的实例都会拥有自己的name属性!

所以推荐大家,以后在定义对象的时候:把属性放到定义里,而把对象的方法放到原型里!

转载地址:http://fmtci.baihongyu.com/

你可能感兴趣的文章
Jenkins + Docker + SpringCloud 微服务持续集成(一)
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成 - 单机部署(二)
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成 - 高可用集群部署(三)
查看>>
Golang struct 指针引用用法(声明入门篇)
查看>>
Linux 粘滞位 suid sgid
查看>>
C#控件集DotNetBar安装及破解
查看>>
Winform皮肤控件IrisSkin4.dll使用
查看>>
Winform多线程
查看>>
C# 托管与非托管
查看>>
Node.js中的事件驱动编程详解
查看>>
mongodb 命令
查看>>
MongoDB基本使用
查看>>
mongodb管理与安全认证
查看>>
nodejs内存控制
查看>>
nodejs Stream使用中的陷阱
查看>>
MongoDB 数据文件备份与恢复
查看>>
数据库索引介绍及使用
查看>>
MongoDB数据库插入、更新和删除操作详解
查看>>
MongoDB文档(Document)全局唯一ID的设计思路
查看>>
mongoDB简介
查看>>