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 动画卷页 返回顶部 动画特效(兼容Chrome)
Feb 15 Javascript
js数组操作学习总结
Nov 04 Javascript
JS判断是否360安全浏览器极速内核的方法
Jan 29 Javascript
js实现非常简单的焦点图切换特效实例
May 07 Javascript
JavaScript DOM 学习总结(五)
Nov 24 Javascript
微信小程序 form组件详解及简单实例
Jan 10 Javascript
JavaScript之class继承_动力节点Java学院整理
Jul 03 Javascript
微信小程序开发animation心跳动画效果
Aug 16 Javascript
利用Javascript实现一套自定义事件机制
Dec 14 Javascript
JS设计模式之状态模式概念与用法分析
Feb 05 Javascript
Vuex中mutations与actions的区别详解
Mar 01 Javascript
解决vue单页路由跳转后scrollTop的问题
Sep 03 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
后宫无数却洁身自好的男主,唐三只爱小舞
2020/03/02 国漫
PHP设计聊天室步步通
2006/10/09 PHP
php下使用无限生命期Session的方法
2007/03/16 PHP
php获取本地图片文件并生成xml文件输出具体思路
2013/04/27 PHP
Linux下PHP连接Oracle数据库
2014/08/20 PHP
又十个超级有用的PHP代码片段
2015/09/24 PHP
浅析Yii2 GridView 日期格式化并实现日期可搜索教程
2016/04/22 PHP
laravel excel 上传文件保存到本地服务器功能
2019/11/14 PHP
JS加ASP二级域名转向的代码
2007/05/17 Javascript
Javascript 继承机制的实现
2009/08/12 Javascript
jquery 删除字符串最后一个字符的方法解析
2014/02/11 Javascript
js闭包所用的场合以及优缺点分析
2015/06/22 Javascript
jQuery根据元素值删除数组元素的方法
2015/06/24 Javascript
jquery实现页面常用的返回顶部效果
2016/03/04 Javascript
基于Turn.js 实现翻书效果实例解析
2016/06/20 Javascript
jquery实现界面无刷新加载登陆注册
2016/07/30 Javascript
详解MVC如何使用开源分页插件(shenniu.pager.js)
2016/12/16 Javascript
js实现消息滚动效果
2017/01/18 Javascript
jquery拼接ajax 的json和字符串拼接的方法
2017/03/11 Javascript
微信小程序 动态绑定事件并实现事件修改样式
2017/04/13 Javascript
聊聊那些使用前端Javascript实现的机器学习类库
2017/09/18 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
2018/01/12 Javascript
加快Vue项目的开发速度的方法
2018/12/12 Javascript
JavaScript DOM常用操作代码汇总
2020/07/03 Javascript
[01:02:54]完美世界DOTA2联赛PWL S2 FTD vs GXR 第一场 11.22
2020/11/26 DOTA
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
2016/11/02 Python
Python中的__slots__示例详解
2017/07/06 Python
手把手教你pycharm专业版安装破解教程(linux版)
2019/09/26 Python
python 基于opencv实现图像增强
2020/12/23 Python
迪卡侬英国官网:Decathlon英国
2017/04/08 全球购物
应用心理学个人的求职信
2013/12/08 职场文书
家长给幼儿园的表扬信
2014/01/09 职场文书
大型晚会策划方案
2014/02/06 职场文书
学校领导班子群众路线整改措施
2014/09/16 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
2022/04/20 MySQL