js修改原型的属性使用介绍
2023-06-13 09:15:16 时间
在javascript中原型(prototype)定义了特定类型的所有实例都可以访问的属性和方法,很多些情况下需要重新对原型中的属性赋值,如果方法错误会导致一些意想不到的情况(仅仅是对像我这样的新手奋斗),下面通过测试对这部分知识做一个简单的总结。
基本类型定义如下:
复制代码代码如下:
基本类型定义如下:
functionPerson(){}
Person.prototype={
constructor:Person,
name:"person",
age:100,
friends:["a","b"],
getName:function(){
returnthis.name;
}
};
定义两个Person的实例,修改实例中的name属性(该属性是在prototype中定义的),测试代码如下
varp1=newPerson();
varp2=newPerson();
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中所有的传递都是值传递,这个值可以是个指向引用类型的指针,所以等号并不意味着修改这个引用对象,而是切换了原来的引用关系,下面再通过代码说明这个问题
varobj=newObject();
obj.name="obj";
functionchangeObj(o){
o.name="changed";
o=newObject();
o.name="newObj";
}
changeObj(obj);
document.write(obj.name);//changed
在changedObj方法中o=newObject()并没有修改参数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,这里的代码实例仅仅说明这个知识点,并无实际意义)
相关文章
- js面试题及答案2020_JS面试题大全
- 【说站】js中pop和push的比较
- JS函数无限柯里化
- Fabric.js 保存自定义属性
- JS对象属性描述符详解
- JS hasOwnProperty()方法:检测一个属性是否是对象的自有属性
- 妙用JS获取Oracle信息的快速方法(js获取Oracle)
- 使用JS操作Oracle数据库探索潜在可能性(js和oracle数据库)
- JavaScript探索之旅掌握Oracle和JS的完美融合(js与oracle)
- JS获得鼠标位置(兼容多浏览器ie,firefox)脚本之家修正版
- js实现图片预加载(js操作Image对象属性complete,事件onload异步加载图片)
- js实现css风格选择器(压缩后2KB)
- js获取TreeView控件选中节点的Text和Value值的方法
- js兼容的placeholder属性详解
- js动态修改input输入框的type属性(实现方法解析)
- 一个简单的JS时间控件示例代码(JS时分秒时间控件)
- 使用变量动态设置js的属性名