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给多个不同元素添加class样式的方法
Mar 26 Javascript
在JavaScript中操作时间之getUTCDate()方法的使用
Jun 10 Javascript
JS实现的不规则TAB选项卡效果代码
Sep 18 Javascript
Javascript删除指定元素节点的方法
Jun 21 Javascript
微信小程序 实战实例开发流程详细介绍
Jan 05 Javascript
详解Javascript中DOM的范围
Feb 13 Javascript
vue.js从安装到搭建过程详解
Mar 17 Javascript
Bootstrap组件之下拉菜单,多级菜单及按钮布局方法实例
May 25 Javascript
JavaScript代码判断输入的字符串是否含有特殊字符和表情代码实例
Aug 17 Javascript
vue学习之mintui picker选择器实现省市二级联动示例
Oct 12 Javascript
react native 获取地理位置的方法示例
Aug 28 Javascript
微信小程序开发数据缓存基础知识辨析及运用实例详解
Nov 06 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
用Socket发送电子邮件
2006/10/09 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
2015/10/09 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
解决安装WampServer时提示缺少msvcr110.dll文件的问题
2017/07/09 PHP
借用Google的Javascript API Loader来加速你的网站
2009/01/28 Javascript
基于jquery的无刷新分页技术
2011/06/11 Javascript
jquery实现最简单的滑动菜单效果代码
2015/09/12 Javascript
JSONP跨域请求实例详解
2016/07/04 Javascript
AngularGauge 属性解析详解
2016/09/06 Javascript
javascript中replace使用方法总结
2017/03/01 Javascript
基于JS实现仿百度百家主页的轮播图效果
2017/03/06 Javascript
js实现网页定位导航功能
2017/03/07 Javascript
详解vue.js+UEditor集成 [前后端分离项目]
2017/07/07 Javascript
AngularJS中的路由使用及实现代码
2017/10/09 Javascript
vue使用v-if v-show页面闪烁,div闪现的解决方法
2018/10/12 Javascript
Vue.js页面中有多个input搜索框如何实现防抖操作
2019/11/04 Javascript
webpack DllPlugin xxx is not defined解决办法
2019/12/13 Javascript
Python对象的深拷贝和浅拷贝详解
2014/08/25 Python
Python爬取读者并制作成PDF
2015/03/10 Python
python访问mysql数据库的实现方法(2则示例)
2016/01/06 Python
解决python明明pip安装成功却找不到包的问题
2019/08/28 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
2019/09/26 Python
安装Pycharm2019以及配置anconda教程的方法步骤
2019/11/11 Python
python实现批量命名照片
2020/06/18 Python
python通过函数名调用函数的几种场景
2020/09/23 Python
Styleonme中文网:韩国高档人气品牌
2017/06/21 全球购物
精油和天然健康美容产品:Art Naturals
2018/01/27 全球购物
20世纪40年代连衣裙和复古服装:The Seamstress Of Bloomsbury
2018/07/24 全球购物
俄罗斯电子产品、计算机和家用电器购物网站:OLDI
2019/10/27 全球购物
Groupon荷兰官方网站:高达70%的折扣
2019/11/01 全球购物
治超工作实施方案
2014/05/04 职场文书
2014感恩节演讲稿大全
2014/10/11 职场文书
2014年外联部工作总结
2014/11/17 职场文书
债务追讨律师函
2015/06/24 职场文书
2019奶茶店创业计划书范本,值得你借鉴
2019/08/14 职场文书
Python 数据可视化神器Pyecharts绘制图像练习
2022/02/28 Python