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 相关文章推荐
document.getElementById方法在Firefox与IE中的区别
May 18 Javascript
JavaScript 放大镜 移动镜片效果代码
May 09 Javascript
firefox下input type=&quot;file&quot;的size是多大
Oct 24 Javascript
如何实现移动端浏览器不显示 pc 端的广告
Oct 15 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
May 15 Javascript
jQuery实现左侧导航模块的显示与隐藏效果
Jul 04 Javascript
一次$.getJSON不执行的简单记录
Jul 19 Javascript
jQuery Ajax实现跨域请求
Jan 21 Javascript
Vue数组更新及过滤排序功能
Aug 10 Javascript
js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
Sep 19 Javascript
JS自定义滚动条效果
Mar 13 Javascript
JavaScript大数相加相乘的实现方法实例
Oct 18 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编程中字符串处理的5个技巧小结
2007/11/13 PHP
php 处理png图片白色背景色改为透明色的实例代码
2018/12/10 PHP
javascript面向对象包装类Class封装类库剖析
2013/01/24 Javascript
JS复制内容到剪切板的实例代码(兼容IE与火狐)
2013/11/19 Javascript
原生js实现fadein 和 fadeout淡入淡出效果
2014/06/05 Javascript
JavaScript数据结构与算法之栈详解
2015/03/12 Javascript
JavaScript实现斗地主游戏的思路
2016/02/29 Javascript
CKEditor无法验证的解决方案(js验证+jQuery Validate验证)
2016/05/09 Javascript
jquery 动态合并单元格的实现方法
2016/08/26 Javascript
Vue之Watcher源码解析(1)
2017/07/19 Javascript
node.js基于fs模块对系统文件及目录进行读写操作的方法详解
2017/11/10 Javascript
bootstrap-Treeview实现级联勾选
2017/11/23 Javascript
从vue基础开始创建一个简单的增删改查的实例代码(推荐)
2018/02/11 Javascript
详解Vue中watch的高级用法
2018/05/02 Javascript
学习jQuery中的noConflict()用法
2018/09/28 jQuery
浅析vue cli3 封装Svgicon组件正确姿势(推荐)
2020/04/27 Javascript
vue-router的hooks用法详解
2020/06/08 Javascript
vue 自定指令生成uuid滚动监听达到tab表格吸顶效果的代码
2020/09/16 Javascript
Javascript执行上下文顺序的深入讲解
2020/11/04 Javascript
跟老齐学Python之不要红头文件(1)
2014/09/28 Python
Python实现递归遍历文件夹并删除文件
2016/04/18 Python
利用Python实现命令行版的火车票查看器
2016/08/05 Python
python爬取网页转换为PDF文件
2018/06/07 Python
使用pygame写一个古诗词填空通关游戏
2019/12/03 Python
python定义具名元组实例操作
2021/02/28 Python
美国知名日用品连锁超市:Dollar General(多来店)
2017/01/14 全球购物
小型女装店的创业计划书
2014/01/09 职场文书
小学家长会邀请函
2014/01/23 职场文书
小学师德师风整改措施
2014/10/27 职场文书
法务专员岗位职责
2015/02/14 职场文书
幸福终点站观后感
2015/06/04 职场文书
推广普通话宣传标语口号
2015/12/26 职场文书
为什么代码规范要求SQL语句不要过多的join
2021/06/23 MySQL
使用RedisTemplat实现简单的分布式锁
2021/11/20 Redis
OpenStack虚拟机快照和增量备份实现方法
2022/04/04 Servers
《黑岩★★射手 DAWN FALL》BD发售宣传CM公开
2022/04/04 日漫