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 相关文章推荐
js 多种变量定义(对象直接量,数组直接量和函数直接量)
May 24 Javascript
Node.js 学习笔记之简介、安装及配置
Mar 03 Javascript
JS 对象属性相关(检查属性、枚举属性等)
Apr 05 Javascript
详解JavaScript中setSeconds()方法的使用
Jun 11 Javascript
jQuery操作dom实现弹出页面遮罩层(web端和移动端阻止遮罩层的滑动)
Aug 25 Javascript
用瀑布流的方式在网页上插入图片的简单实现方法
Sep 23 Javascript
温故知新——JavaScript中的字符串连接问题最全总结(推荐)
Aug 21 Javascript
详解Vue中watch的详细用法
Nov 28 Javascript
微信小程序自定义键盘 内部虚拟支付
Dec 20 Javascript
在vue中把含有html标签转为html渲染页面的实例
Oct 28 Javascript
JS代码优化的8点建议
Feb 04 Javascript
vue-model实现简易计算器
Aug 17 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上传图片类(随机名,缩略图,加水印)
2010/06/30 PHP
discuz免激活同步登入代码修改方法(discuz同步登录)
2013/12/24 PHP
PHP内核探索:哈希表碰撞攻击原理
2015/07/31 PHP
PHP随机数 C扩展随机数
2016/05/04 PHP
ThinkPHP实现更新数据实例详解(demo)
2016/06/29 PHP
PHP常用函数之格式化时间操作示例
2019/10/21 PHP
php将字符串转换为数组实例讲解
2020/05/05 PHP
Swoole源码中如何查询Websocket的连接问题详解
2020/08/30 PHP
JavaScript Event学习第十一章 按键的检测
2010/02/10 Javascript
S2SH整合JQuery+Ajax实现登录验证功能实现代码
2013/01/30 Javascript
Jquery带搜索框的下拉菜单
2013/05/06 Javascript
jquery增加时编辑jqGrid(实例代码)
2013/11/08 Javascript
javascript页面上使用动态时间具体实现
2014/03/18 Javascript
原生js模拟淘宝购物车项目实战
2015/11/18 Javascript
javascript实现简易计算器的代码
2016/05/31 Javascript
BootStrap中按钮点击后被禁用按钮的最佳实现方法
2016/09/23 Javascript
js实现一个猜数字游戏
2017/03/31 Javascript
微信小程序 sha1 实现密码加密实例详解
2017/07/06 Javascript
Vue登录主页动态背景短视频制作
2019/09/21 Javascript
小程序实现日历左右滑动效果
2019/10/21 Javascript
小程序按钮避免多次调用接口和点击方案实现(不用showLoading)
2020/04/15 Javascript
VueQuillEditor富文本上传图片(非base64)
2020/06/03 Javascript
vue实现简单加法计算器
2020/10/22 Javascript
python函数缺省值与引用学习笔记分享
2013/02/10 Python
python实现简单温度转换的方法
2015/03/13 Python
apache部署python程序出现503错误的解决方法
2017/07/24 Python
python编程线性回归代码示例
2017/12/07 Python
python中map的基本用法示例
2018/09/10 Python
将Pytorch模型从CPU转换成GPU的实现方法
2019/08/19 Python
python manage.py runserver流程解析
2019/11/08 Python
师德个人剖析材料
2014/02/02 职场文书
兰兰过桥教学反思
2014/02/08 职场文书
2014年初一班主任工作总结
2014/11/08 职场文书
销售员自我评价
2015/03/11 职场文书
python文本处理的方案(结巴分词并去除符号)
2021/05/26 Python
navicat 连接Ubuntu虚拟机的mysql的操作方法
2022/04/02 MySQL