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 相关文章推荐
13 个JavaScript 性能提升技巧分享
Jul 26 Javascript
JSON语法五大要素图文介绍
Dec 04 Javascript
JavaScript等比例缩放图片控制超出范围的图片
Aug 06 Javascript
实现图片预加载的三大方法及优缺点分析
Nov 19 Javascript
jQuery中prev()方法用法实例
Jan 08 Javascript
浅析JS异步加载进度条
May 05 Javascript
javascript创建含数字字母的随机字符串方法总结
Aug 01 Javascript
JS冒泡事件与事件捕获实例详解
Nov 25 Javascript
jquery引入外部CDN 加载失败则引入本地jq库
May 23 jQuery
Vue.js 事件修饰符的使用教程
Nov 01 Javascript
微信小程序列表中item左滑删除功能
Nov 07 Javascript
Node.js系列之安装配置与基本使用(1)
Aug 30 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个人网站架设连环讲(二)
2006/10/09 PHP
PHP计划任务之关闭浏览器后仍然继续执行的函数
2010/07/22 PHP
yii的入口文件index.php中为什么会有这两句
2016/08/04 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
2019/10/15 PHP
Array.slice()与Array.splice()的返回值类型
2006/10/09 Javascript
jquery构造器的实现代码小结
2011/05/16 Javascript
JS对象转换为Jquery对象实现代码
2013/12/29 Javascript
Javascript中的String对象详谈
2014/03/03 Javascript
完美实现仿QQ空间评论回复特效
2015/05/06 Javascript
两款JS脚本判断手机浏览器类型跳转WAP手机网站
2015/10/16 Javascript
浅谈html转义及防止javascript注入攻击的方法
2016/12/04 Javascript
整理关于Bootstrap导航的慕课笔记
2017/03/29 Javascript
jQuery实现按比例缩放图片的方法
2017/04/29 jQuery
JS实现多级菜单中当前菜单不随页面跳转样式而发生变化
2017/05/30 Javascript
ionic中的$ionicPlatform.ready事件中的通用设置
2017/06/11 Javascript
angular ng-model 无法获取值的处理方法
2018/10/02 Javascript
jquery实现吸顶导航效果
2020/01/08 jQuery
vue使用echarts画组织结构图
2021/02/06 Vue.js
[02:32]DOTA2亚洲邀请赛 VG战队巡礼
2015/02/03 DOTA
Python编程语言的35个与众不同之处(语言特征和使用技巧)
2014/07/07 Python
轻松实现python搭建微信公众平台
2016/02/16 Python
在PyCharm中三步完成PyPy解释器的配置的方法
2018/10/29 Python
python requests使用socks5的例子
2019/07/25 Python
html5 更新图片颜色示例代码
2014/07/29 HTML / CSS
Wedgwood美国官网:英国骨瓷,精美礼品及家居装饰
2018/02/17 全球购物
德国二手设计师时装和复古时装跳蚤市场:Mädchenflohmarkt
2020/11/09 全球购物
Servlet如何得到服务器的信息
2015/12/22 面试题
计算机专业推荐信范文
2013/11/27 职场文书
小学端午节活动方案
2014/03/13 职场文书
互联网电子商务专业毕业生求职信
2014/03/18 职场文书
环卫工人先进事迹材料
2014/06/02 职场文书
高中教师先进事迹材料
2014/08/22 职场文书
2015年预备党员自我评价
2015/03/04 职场文书
个人维稳承诺书
2015/05/04 职场文书
各类场合主持词开场白范文集锦
2019/08/16 职场文书
详解Django的MVT设计模式
2021/04/29 Python