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,这里的代码实例仅仅说明这个知识点,并无实际意义)


猜你喜欢
- 比如,我要建立一个1,000,000行的数字表: CREATE TABLE dbo.Nums(n INT NOT NULL PRIMARY
- __init__()方法意义重大的原因有两个。第一个原因是在对象生命周期中初始化是最重要的一步;每个对象必须正确初始化后才能正常工作。第二个
- 一、作用创建一个新的Tensor,该Tensor的type和device都和原有Tensor一致,且无内容。二、使用方法如果随机定义一个大小
- 阅读目录一般而言,当我们需要某些功能的模块时(无论是内置模块或自定义功能的模块),可以通过import module 或者 from * i
- 交互设计就是研究人与物体之间如何互动的问题,比如按电梯时,按钮立即高亮,同时屏幕上显示电梯现在所在楼层数,这个过程就是交互设计,而电梯按钮用
- 1、 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务。 2、 开始->程序->Oracle - OraHome81-
- 多数应用场景下,我们需要对重要数据进行备份、并放置到一个安全的地方,以备不时之需。常见的 MySQL 数据备份方式有,直接打包复制对应的数据
- 今天彬Go将和大家一起讨论网页设计趋势中很重要的环节,那就是”勾引”用户的按钮。所谓”勾引”用户的按钮,其实对于Web设计师来说,就是如何设
- 我写过一个外部模块扩展,现在开始看PHP源码中的mysql扩展,它是可以被集成到PHP内部的,所以应该算是内置的扩展了。 该扩展需要用到my
- 本文实例讲述了Python实现的IP端口扫描工具类。分享给大家供大家参考,具体如下:去年服务器老是被攻击,每次上线之后,上线的人急急忙忙下班
- 由于项目需要,所以打算好好学习下bootstrap框架,之前了解一点,框架总体不难,但涉及到的东西还是很多,想要熟练掌握它,还是要多练练。一
- CocosCreator版本:2.4.2jszip的实际项目应用游戏中有大量配置的情况下,文件会变得非常大,所以有些游戏会采用zip包压缩解
- 官方说明链接:https://intellij-support.jetbrains.com/hc/en-us/community/posts
- 引言写这篇文章主要是周末休息太无聊,看了看别人代码,发现基本上要么是多协程下载文件要么就只有单协程的断点续传,所以就试了试有进度条的多协程下
- root账户为MySQL的超级管理员用户,拥有MySQL提供的所有权限。我们登录了root账户可以重置其它创建的所有用户的密码,那么root
- 【历史背景】岁月更迭中我已经从事MySQL-DBA这个工作三个年头,见证MySQL从“基本可用”,“边缘系统可以用MySQL”,“哦操!你怎
- 在一些面试或者力扣题中都要求用双向链表来实现,下面是基于python的双向链表实现。一、构建链表节点class Node: &n
- 本文实例为大家分享了python将图片转成字符画的具体代码,供大家参考,具体内容如下该代码引用了PIL库的Image,所以必须先安装PIP,
- mysql drop database命令用于删除一个数据库,如果试图使用drop database命令删除一个不存在的数据库,那么那么你会
- WeUI 是一套同微信原生视觉体验一致的基础样式库,由微信官方设计团队为微信内网页和微信小程序量身设计,令用户的使用感知更加统一。