JS原型对象的问题
原型模式最大的问题是由其共享的本性所导致的。
我们知道,原型中所有的成员是被很多实例共享的,这种共享对于函数非常合适。对于那些包含基本值的属性倒也说得过去,毕竟可以通过在实例上添加一个同名的属性来隐藏原型中对应的属性;
然而,对于包含引用类型值的属性来说,问题就比较突出了。
来看下面的代码:
function Wede(){}
//重写构造函数的原型对象,其中定义了一个基本类型和一个引用类型;
Wede.prototype={name:"wede.zhao",friends:["james","wade"]} //Object {name: "wede.zhao", friends: Array[2]}
//实例化两个对象
var person1=new Wede();
var person2=new Wede();
//修改一个实例的基本类型值
person1.name="zhao wei";
//输出两个实例基本类型值
person1.name;
"zhao wei"
person2.name;
"wede.zhao"
可以看出,对实例person1基本类型的修改并没有影响到实例person2;
其实这里的本质是:为实例person1新增了一个属性name,以至于覆盖了构造函数原型对象中的同名属性;
而新增的person1.name属性是属于实例的,不属于构造函数的原型对象;
所以在查找属性name的时候首先从实例中找到;
再看下面的例子:
//修改实例person1共享于构造函数原型对象中的引用类型friends;
//其实这里还应该注意,与上面的修改基本类型不同的是,这里不是为实例person1新增成员,而是修改它共享于原型对象的成员;
person1.friends.push("bosh");
//所以会导致下面的结果:
person1.friends;
["james", "wade", "bosh"]
person2.friends;
["james", "wade", "bosh"]
//而事实也证明,两个实例成员指向的是同一个引用:
person1.friends===person2.friends; //true
JS原型对象的问题的更多相关文章
- JS原型对象通俗"唱法"
书上对于原型对象的说法给我整的眼花缭乱,完全不知道它在说什么,查了好多资料,终于有了些理解,下面我以通俗的大白话说说我对原型对象的理解. 1.关于原型对象的重要知识点 首先要知道一个很重要的知识点,一 ...
- js原型对象与Java类的比较
在我学习Javascript的原型对象时,我总是不自觉地拿Java的类思想来做比较,时间久了,我渐渐认识到二者有巨大的不同. 首先,类是不能直接当方法来运行,它最简便的方式是调用其静态方法:而原型对象 ...
- js原型对象
原型对象是什么? 在js中,每一个创建的的函数都会有一个prototype属性,这个属性指向一个对象,这个对象就是原型对象 function lla(){} console.log(lla.proto ...
- js原型对象中属性被覆盖(1)
/** *@author 程无衣 *@description 关于在原型对象中属性被覆盖 */ function Person(){} Person.prototy ...
- js原型对象,每个new出来的新对象都有独立的原型对象__proto__
刚才看一篇博文的时候, 动手测试了一下 JavaScript的原型链, 原型对象,发现每个构造器(赋给了某个 prototype ) new 出来的对象都有各自独立的原型对象 __proto__. p ...
- 对js原型对象的拓展和原型对象的重指向的区别的研究
我写了如下两段代码: function Person(){} var p1 = new Person(); Person.prototype = { constructor: Person, name ...
- 对js原型对象、实例化对象及prototype属性的一些见解
什么是原型对象? 请看下面的代码,我们以各种姿势,创建了几个方法! function fn1() { } var fn2 = function () { } var fn3 = new Functio ...
- js 原型 对象篇
一切皆对象 js中 值类型就不是对象 剩下的都是对象(也就是引用类型) typeof()运算符 判断四种值类型 typeof 10; --> Number || typeof &quo ...
- JS核心系列:浅谈原型对象和原型链
在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function). 一般而言,通过new Function产生的对象是函数对象,其他对 ...
随机推荐
- unyielding 是否屈服与多线程 勿以恶小而为之 threads are a bad idea
小结: 1. python的妥协 2. As we know, threads are a bad idea, (for most purposes). Threads make local reas ...
- SpringBoot表单数据校验
Springboot中使用了Hibernate-validate作为默认表单数据校验框架 在实体类上的具体字段添加注解 public class User { @NotBlank private St ...
- Docs-.NET-C#-指南-语言参考-预处理器指令:#else(C# 参考)
ylbtech-Docs-.NET-C#-指南-语言参考-预处理器指令:#else(C# 参考) 1.返回顶部 1. #else(C# 参考) 2015/07/20 #else 允许创建复合条件指令, ...
- SQL-W3School-函数:SQL GROUP BY 语句
ylbtech-SQL-W3School-函数:SQL GROUP BY 语句 1.返回顶部 1. 合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句. GROUP BY 语句 GROU ...
- Django文档
https://docs.djangoproject.com/zh-hans/2.1/
- WordPress的摘要显示方式
WordPress的后台有摘要显示的栏目,如果没有显示,需要设置一下,如图 在列表页现实的内容的时候,一般是有摘要的显示摘要,没有摘要的截取文章的前一部分文字.代码如下 <?php if(has ...
- leetcode903 Valid Permutations for DI Sequence
思路: dp[i][j]表示到第i + 1个位置为止,并且以剩下的所有数字中第j + 1小的数字为结尾所有的合法序列数. 实现: class Solution { public: int numPer ...
- eNSP下利用三层交换机实现VLAN间路由
我们可以通过配置VLANif接口的方式来使交换机实现路由交换. 而VLANif接口是基于网络层的接口,可以配置ip地址 拓扑图如下
- @Value注入static属性
1. 给参数注入,执行set方法 public class SendMessageCenter { private static String message; private stat ...
- centos 防火墙相关命令
防火墙关闭: systemctl stop firewalld systemctl disable firewalld 重启防火墙: systemctl enable firewalld system ...