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 相关文章推荐
Javascript实例教程(19) 使用HoTMetal(4)
Dec 23 Javascript
JavaScript学习历程和心得小结
Aug 16 Javascript
jquery 使用点滴函数代码
May 20 Javascript
纯js写的分页表格数据为json串
Feb 18 Javascript
js中的setInterval和setTimeout使用实例
May 09 Javascript
网站基于flash实现的Banner图切换效果代码
Oct 14 Javascript
JS构造函数与原型prototype的区别介绍
Jul 04 Javascript
AngularJS入门教程之双向绑定详解
Aug 18 Javascript
深入理解JS继承和原型链的问题
Dec 17 Javascript
React Native实现地址挑选器功能
Oct 24 Javascript
BootStrap TreeView使用实例详解
Nov 01 Javascript
使用jQuery实现掷骰子游戏
Oct 24 jQuery
解决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实现更新中间关联表数据的两种方法
2014/09/01 PHP
php socket通信简单实现
2016/11/18 PHP
js 获取浏览器高度和宽度值(多浏览器)
2009/09/02 Javascript
File, FileReader 和 Ajax 文件上传实例分析(php)
2011/04/27 Javascript
JavaSript中变量的作用域闭包的深入理解
2014/05/12 Javascript
学习使用bootstrap3栅格系统
2016/04/12 Javascript
JS版微信6.0分享接口用法分析
2016/10/13 Javascript
AngularJS变量及过滤器Filter用法分析
2016/11/22 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
微信小程序 仿猫眼实现实例代码
2017/03/14 Javascript
使用JS在浏览器中判断当前网络连接状态的几种方法
2017/05/05 Javascript
vue项目中的webpack-dev-sever配置方法
2017/12/14 Javascript
通过webpack引入第三方库的方法
2018/07/20 Javascript
JS使用遮罩实现点击某区域以外时弹窗的弹出与关闭功能示例
2018/07/31 Javascript
微信小程序使用wx.request请求服务器json数据并渲染到页面操作示例
2019/03/30 Javascript
js验证账户名是否重复
2020/05/26 Javascript
ES11屡试不爽的新特性,你用上了几个
2020/10/21 Javascript
[06:25]DOTA2英雄梦之声_第17期_大地之灵
2014/06/20 DOTA
对python打乱数据集中X,y标签对的方法详解
2018/12/14 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
2019/06/28 Python
python利用paramiko实现交换机巡检的示例
2020/09/22 Python
HTML5 CSS3给网站设计带来出色效果
2009/07/16 HTML / CSS
意大利奢华内衣制造商:Cosabella
2017/08/29 全球购物
Bally巴利中国官网:经典瑞士鞋履、手袋及配饰奢侈品牌
2018/10/09 全球购物
学校消防安全制度
2014/01/30 职场文书
房地产广告词大全
2014/03/19 职场文书
会员活动策划方案
2014/08/19 职场文书
五五普法心得体会
2014/09/04 职场文书
上班迟到检讨书
2014/09/15 职场文书
吃空饷专项整治方案
2014/10/27 职场文书
2015年办公室文秘工作总结
2015/04/30 职场文书
个人维稳承诺书
2015/05/04 职场文书
个人收入证明范本
2015/06/12 职场文书
2015年幼儿园国庆节活动总结
2015/07/30 职场文书
慰问信的写作格式及范文!
2019/06/24 职场文书
python调用ffmpeg命令行工具便捷操作视频示例实现过程
2021/11/01 Python