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 ajax提交表单数据的两种方式
Nov 24 Javascript
原生JS实现表单checkbook获取已选择的值
Jul 21 Javascript
JS取文本框中最小值的简单实例
Nov 29 Javascript
基于jquery实现一个滚动的分步注册向导-附源码
Aug 26 Javascript
举例讲解JavaScript中关于对象操作的相关知识
Nov 16 Javascript
jQuery中选择器的基础使用教程
May 23 Javascript
AngularJS 实现JavaScript 动画效果详解
Sep 08 Javascript
vue 打包后的文件部署到express服务器上的方法
Aug 09 Javascript
Vue官方文档梳理之全局配置
Nov 22 Javascript
详解js创建对象的几种方法及继承
Apr 12 Javascript
微信小程序:报错(in promise) MiniProgramError
Oct 30 Javascript
element中Steps步骤条和Tabs标签页关联的解决
Dec 08 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用正则表达式匹配URL的简单方法
2013/11/12 PHP
sae使用smarty模板的方法
2013/12/17 PHP
有关于PHP中常见数据类型的汇总分享
2014/01/06 PHP
php中最简单的字符串匹配算法
2014/12/16 PHP
php使用递归计算文件夹大小
2014/12/24 PHP
php输出图像的方法实例分析
2017/02/16 PHP
Paypal实现循环扣款(订阅)功能
2017/03/23 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
浅谈php的TS和NTS的区别
2019/03/13 PHP
Laravel + Elasticsearch 实现中文搜索的方法
2020/02/02 PHP
jQuery)扩展jQuery系列之一 模拟alert,confirm(一)
2010/12/04 Javascript
Javascript核心读书有感之语句
2015/02/11 Javascript
js 判断所选时间(或者当前时间)是否在某一时间段的实现代码
2015/09/05 Javascript
深入理解Commonjs规范及Node模块实现
2017/05/17 Javascript
layui表格实现代码
2017/05/20 Javascript
浅谈箭头函数写法在ReactJs中的使用
2017/08/22 Javascript
详解关于react-redux中的connect用法介绍及原理解析
2017/09/11 Javascript
jQuery插件jsonview展示json数据
2018/05/26 jQuery
vue2过滤器模糊查询方法
2018/09/16 Javascript
React Component存在的几种形式详解
2018/11/06 Javascript
说说Vue.js中的functional函数化组件的使用
2019/02/12 Javascript
详解nvm管理多版本node踩坑
2019/07/26 Javascript
详解vue高级特性
2020/06/09 Javascript
用vite搭建vue3应用的实现方法
2021/02/22 Vue.js
[08:06]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant 选手采访
2021/03/11 DOTA
Python减少循环层次和缩进的技巧分析
2016/03/15 Python
利用python实现数据分析
2017/01/11 Python
浅谈python的dataframe与series的创建方法
2018/11/12 Python
Python Pickle 实现在同一个文件中序列化多个对象
2019/12/30 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
Oroton中国官网:澳洲知名奢侈配饰品牌
2017/03/26 全球购物
培训自我鉴定
2014/01/31 职场文书
安全资料员岗位职责范本
2014/06/28 职场文书
2014年最新领导班子整改方案
2014/09/27 职场文书
信用卡工作证明范本
2015/06/19 职场文书
唤醒紫霞仙子,携手再游三界!大话手游X《大话西游》电影合作专属剧情任务
2022/04/03 其他游戏