js修改原型的属性使用介绍


Posted in Javascript onJanuary 26, 2014

在javascript中原型(prototype)定义了特定类型的所有实例都可以访问的属性和方法,很多些情况下需要重新对原型中的属性赋值,如果方法错误会导致一些意想不到的情况(仅仅是对像我这样的新手奋斗),下面通过测试对这部分知识做一个简单的总结。

基本类型定义如下:

function Person(){} Person.prototype={ 
constructor:Person, 
name:"person", 
age:100, 
friends:["a","b"], 
getName:function(){ 
return this.name; 
} 
};

定义两个Person的实例,修改实例中的name属性(该属性是在prototype中定义的),测试代码如下
var p1=new Person(); 
var p2=new Person(); document.write(p1.name+"<br/>"); //person 
document.write(p2.name+"<br/>"); //person 
p1.name="p1"; 
document.write(p1.name+"<br/>"); //p1 
document.write(p2.name+"<br/>"); //person 
document.write(p1.hasOwnProperty("name")+"<br/>"); //true 属于对象 
document.write(p2.hasOwnProperty("name")+"<br/>"); //false 属于原型 
document.write(Object.keys(p1)+"<br/>"); //name 
document.write(Object.keys(p2)+"<br/>"); // 空 
document.write(Object.getOwnPropertyNames(Person.prototype)+"<br/>"); //constructor,name,age,friends,getName 
document.write(Person.prototype.name+"<br/>"); //person

经过测试可以发现p1.name="p1"并不是修改了name的值而是在实例p1中新增加了一个name属性覆盖了prototype中的name属性,从后续的判断中就可以看出这时候p1的name属性已经是一个实例属性而不是原型属性,后面的Object.keys(p1)也可以看出p1这个实例中多了一个name属性而p2中没有。在js中所有的传递都是值传递,这个值可以是个指向引用类型的指针,所以等号并不意味着修改这个引用对象,而是切换了原来的引用关系,下面再通过代码说明这个问题
var obj=new Object(); 
obj.name="obj"; function changeObj(o){ 
o.name="changed"; 
o=new Object(); 
o.name="newObj"; 
} 
changeObj(obj); 
document.write(obj.name); //changed

在changedObj方法中o=new Object()并没有修改参数o的值,而是切断了原来的引用关系,所以结果并不是newObj而是changed

接下来测试一下修改第一个例子中prototype中的friends属性,这个属性是一个引用类型

p1.friends.push("c"); 
document.write(p1.friends+"<br/>"); //a,b,c 
document.write(p2.friends+"<br/>"); //a,b,c p1.friends=["x","y","z"]; 
document.write(p1.friends+"<br/>"); //x,y,z 
document.write(p2.friends+"<br/>"); //a,b,c 
document.write(p1.hasOwnProperty("friends")+"<br/>"); //true 属于对象 
document.write(p2.hasOwnProperty("friends")+"<br/>"); //false 属于原型 
document.write(Object.keys(p1)+"<br/>"); //name,friend 
document.write(Object.keys(p2)+"<br/>"); //空 
document.write(Object.getOwnPropertyNames(Person.prototype)+"<br/>"); //constructor,name,age,friends,getName 
document.write(Person.prototype.friends+"<br/>"); //a,b,c

这次测试结果与第一次的测试基本相同,当通过等号修改时,这时候会切断原来的引用并为实例创建一个新的属性且覆盖了prototype中的同名属性

基于这两个测试结果发现在实例中不能直接修改prototype中的值类型属性(当然这种值类型不应该定义在prototype,这里的代码实例仅仅说明这个知识点,并无实际意义)

Javascript 相关文章推荐
jquery中使用$(#form).submit()重写提交表单无效原因分析及解决
Mar 25 Javascript
js取值中form.all和不加all的区别介绍
Jan 20 Javascript
jquery修改网页背景颜色通过css方法实现
Jun 06 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
May 20 Javascript
Bootstrap3学习笔记(三)之表格
May 20 Javascript
jquery获取table指定行和列的数据方法(当前选中行、列)
Nov 07 Javascript
jQuery实现鼠标滑过图片移动特效
Dec 08 Javascript
JS中利用localStorage防止页面动态添加数据刷新后数据丢失
Mar 10 Javascript
webpack3之loader全解析
Oct 26 Javascript
es6新特性之 class 基本用法解析
May 05 Javascript
基于javascript实现贪吃蛇经典小游戏
Apr 10 Javascript
Nuxt配置Element-UI按需引入的操作方法
Jul 06 Javascript
解决extjs grid 不随窗口大小自适应的改变问题
Jan 26 #Javascript
JS批量修改PS中图层名称的方法
Jan 26 #Javascript
table对象中的insertRow与deleteRow使用示例
Jan 26 #Javascript
购物车选中得到价格实现示例
Jan 26 #Javascript
动态添加option及createElement使用示例
Jan 26 #Javascript
js和jquery使按钮失效为不可用状态的方法
Jan 26 #Javascript
js中创建对象的几种方式示例介绍
Jan 26 #Javascript
You might like
PHP脚本的10个技巧(6)
2006/10/09 PHP
PHP包含文件函数include、include_once、require、require_once区别总结
2014/04/05 PHP
php json转换成数组形式代码分享
2014/11/10 PHP
thinkphp框架使用JWTtoken的方法详解
2019/10/10 PHP
js阻止浏览器默认行为的简单实例
2016/05/15 Javascript
清除js缓存的多种方法总结
2016/12/09 Javascript
微信小程序实现瀑布流布局与无限加载的方法详解
2017/05/12 Javascript
vue loadmore组件上拉加载更多功能示例代码
2017/07/19 Javascript
ES6学习教程之Map的常用方法总结
2017/08/03 Javascript
关于Vue Webpack2单元测试示例详解
2017/08/14 Javascript
jquery插件开发之选项卡制作详解
2017/08/30 jQuery
js 只比较时间大小的实例
2017/10/26 Javascript
jQuery插件实现的日历功能示例【附源码下载】
2018/09/07 jQuery
express express-session的使用小结
2018/12/12 Javascript
JS 自执行函数原理及用法
2019/08/05 Javascript
[01:20]DOTA2 齐天大圣至宝动态展示
2016/12/13 DOTA
学习python (2)
2006/10/31 Python
Python写的一个简单DNS服务器实例
2014/06/04 Python
Python中使用第三方库xlutils来追加写入Excel文件示例
2015/04/05 Python
Python 2.x如何设置命令执行的超时时间实例
2017/10/19 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
2018/02/10 Python
unittest+coverage单元测试代码覆盖操作实例详解
2018/04/04 Python
python 定时任务去检测服务器端口是否通的实例
2019/01/26 Python
使用python进行波形及频谱绘制的方法
2019/06/17 Python
python面向对象之类属性和类方法案例分析
2019/12/30 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
Whittard官方海外旗舰店:英国百年茶叶品牌
2018/02/22 全球购物
什么是serialVersionUID
2016/03/04 面试题
大学校园毕业自我鉴定
2014/01/15 职场文书
社区综治宣传月活动总结
2014/07/02 职场文书
机械设备与数控技术专业求职信
2014/08/10 职场文书
2014年小学教学工作总结
2014/11/13 职场文书
2014年培训工作总结范文
2014/11/27 职场文书
2015年宣传部工作总结范文
2015/03/31 职场文书
歌舞青春观后感
2015/06/10 职场文书
MySQL之select、distinct、limit的使用
2021/11/11 MySQL