js修改原型的属性使用介绍

 更新时间:2014年01月26日 16:48:15   作者:  
原型(prototype)定义了特定类型的所有实例都可以访问的属性和方法,很多些情况下需要重新对原型中的属性赋值,下面为大家介绍下如何修改原型
在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实现更换背景图片

    JavaScript实现更换背景图片

    这篇文章主要为大家详细介绍了JavaScript实现更换背景图片,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • JS异步宏队列与微队列原理区别详解

    JS异步宏队列与微队列原理区别详解

    这篇文章主要介绍了JS异步宏队列与微队列原理区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 基于Typescript与Axios的接口请求管理详解

    基于Typescript与Axios的接口请求管理详解

    接口是一系列抽象方法的声明,是一些方法特征的集合,这些方法都应该是抽象的,需要由具体的类去实现,然后第三方就可以通过这组抽象方法调用,让具体的类执行具体的方法,这篇文章主要给大家介绍了基于Typescript与Axios的接口请求管理的相关资料,需要的朋友可以参考下
    2021-09-09
  • 手机端js和html5刮刮卡效果

    手机端js和html5刮刮卡效果

    这篇文章主要为大家详细介绍了手机端js和html5刮刮卡效果,刮开之后是随机生成的8位码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • js当月水电气简单计算器

    js当月水电气简单计算器

    一个可以计算当月水电气多少钱的计算器 说明:输入各项后,在页面任意空白处点击鼠标,页面自动计算一次结果!,每项都必须填写,填0也可以
    2008-04-04
  • JavaScript实现抽奖器效果

    JavaScript实现抽奖器效果

    这篇文章主要为大家详细介绍了JavaScript实现抽奖器效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • JavaScript去掉数组重复项的方法分析【测试可用】

    JavaScript去掉数组重复项的方法分析【测试可用】

    这篇文章主要介绍了JavaScript去掉数组重复项的方法,结合实例形式分析了javascript使用object特性实现数组去除重复项功能的相关操作技巧,需要的朋友可以参考下
    2018-07-07
  • JS快速实现移动端拼图游戏

    JS快速实现移动端拼图游戏

    最近开发一个有关手机端拼图游戏,是基于js实现的。今天小编抽时间把具体实现代码分享到脚本之家平台供大家参考,对js移动端拼图游戏感兴趣的朋友参考下吧
    2016-09-09
  • JS实现可自定义大小,可双击关闭的弹出层效果

    JS实现可自定义大小,可双击关闭的弹出层效果

    这篇文章主要介绍了JS实现可自定义大小,可双击关闭的弹出层效果,涉及JavaScript定时函数及页面元素动态操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • JavaScript中清空数组的三种方法分享

    JavaScript中清空数组的三种方法分享

    JavaScript中清空数组的三种方法分享,需要的朋友可以参考下。
    2011-04-04

最新评论