js修改原型的属性使用介绍
发布时间:2024-04-10 10:51:03
标签:js修改原型
在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,这里的代码实例仅仅说明这个知识点,并无实际意义)
0
投稿
猜你喜欢
- request库是python的第三方库,它也是目前公认的爬取网页最好的第三方库,其特点是:简单、简洁,甚至用一行代码就能从网页上获取相关资
- 本文实例为大家分享了python实现趣味图片字符化的具体代码,供大家参考,具体内容如下主要使用PIL库先放效果图:代码如下:#coding=
- 工作中遇到大概20万的数据插入操作,程序编完后发现运行超时,修改PHP最大执行时间到600,还是超时,检查超时前插入的数据条数推算一下,大概
- 很多人在学习了基本的Python语言知识后,就转入应用阶段了,后期很少对语言本身的新变化、新内容进行跟踪学习和知识更新,甚至连已经发布了好几
- 我们知道,任何数据库系统都无法避免崩溃的状况,即使你使用了Clustered,双机热备……仍然无
- 英文文档:eval(expression, globals=None, locals=None)The arguments are a st
- Python编程中对于某些需要重复调用的程序,可以使用函数进行定义,基本形式为:def 函数名(参数1, 参数2, ……, 参数N):执行语
- 一般的网站会有很多页面,面包屑导航可以大大改善用户寻找他们的路径的方法。就可用性而言,面包屑可以减少一个网站的用户返回上一级页面的操作次数,
- matplotlib简介如果你在大学里参加过数学建模竞赛或者是用过MATLAB的话,相比会对这一款软件中的画图功能印象深刻。MATLAB可以
- python十进制转二进制python中十进制转二进制使用 bin() 函数。bin() 返回一个整数 int 或者长整数 long int
- 1.hashlib密码散列hashlib模块定义了一个API来访问不同的密码散列算法。要使用一个特定的散列算法,可以用适当的构造器函数或ne
- Decode函数的语法结构如下:decode (expression, search_1, result_1)decode (express
- 学习JQUERY就应该从最基本的学起,基本的就应该是语法了,在这里,我们有必要先温习一下JAVASCRIPT的一些知识。语法就不用说了,都是
- 本文实例讲述了Go语言使用sort包对任意类型元素的集合进行排序的方法。分享给大家供大家参考。具体如下:使用sort包的函数进行排序时,集合
- 详细:1.闵可夫斯基距离(Minkowski Distance)2.欧氏距离(Euclidean Distance)3.曼哈顿距离(Manh
- 前言最近在工作中遇到一个需求:修改MySQL用户的权限,需要限制特定IP地址才能访问,第一次遇到这类需求,结果在测试过程,使用更新系统权限报
- 前言random模块实现了各种分布的伪随机数生成器。伪随机数:人类使用算法等方式,以一个基准(也被称为种子,常用的是时间戳)来构造一系列数字
- 自从2005年8月11日阿里巴巴宣布收购雅虎中国的全部资产后,做为阿里巴巴集团的创始人马云心里盘算的事应该是如何把雅虎中虎整合进阿里巴巴这个
- 卸载MySQL1、在控制面板,卸载MySQL的所有组件控制面板——》所有控制面板项——》程序和功能,卸载所有和MySQL有关的程序2、找到你
- 源码安装Python第三方库几乎都可以在github或者 pypi上找到源码。源码包格式大概有zip 、 tar.zip、 tar.bz2。