原型模式最大的问题是由其共享的本性所导致的。
我们知道,原型中所有的成员是被很多实例共享的,这种共享对于函数非常合适。对于那些包含基本值的属性倒也说得过去,毕竟可以通过在实例上添加一个同名的属性来隐藏原型中对应的属性;
然而,对于包含引用类型值的属性来说,问题就比较突出了。
来看下面的代码:

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原型对象的问题的更多相关文章

  1. JS原型对象通俗"唱法"

    书上对于原型对象的说法给我整的眼花缭乱,完全不知道它在说什么,查了好多资料,终于有了些理解,下面我以通俗的大白话说说我对原型对象的理解. 1.关于原型对象的重要知识点 首先要知道一个很重要的知识点,一 ...

  2. js原型对象与Java类的比较

    在我学习Javascript的原型对象时,我总是不自觉地拿Java的类思想来做比较,时间久了,我渐渐认识到二者有巨大的不同. 首先,类是不能直接当方法来运行,它最简便的方式是调用其静态方法:而原型对象 ...

  3. js原型对象

    原型对象是什么? 在js中,每一个创建的的函数都会有一个prototype属性,这个属性指向一个对象,这个对象就是原型对象 function lla(){} console.log(lla.proto ...

  4. js原型对象中属性被覆盖(1)

    /**   *@author 程无衣   *@description 关于在原型对象中属性被覆盖   */       function Person(){}       Person.prototy ...

  5. js原型对象,每个new出来的新对象都有独立的原型对象__proto__

    刚才看一篇博文的时候, 动手测试了一下 JavaScript的原型链, 原型对象,发现每个构造器(赋给了某个 prototype ) new 出来的对象都有各自独立的原型对象 __proto__. p ...

  6. 对js原型对象的拓展和原型对象的重指向的区别的研究

    我写了如下两段代码: function Person(){} var p1 = new Person(); Person.prototype = { constructor: Person, name ...

  7. 对js原型对象、实例化对象及prototype属性的一些见解

    什么是原型对象? 请看下面的代码,我们以各种姿势,创建了几个方法! function fn1() { } var fn2 = function () { } var fn3 = new Functio ...

  8. js 原型 对象篇

    一切皆对象 js中  值类型就不是对象  剩下的都是对象(也就是引用类型) typeof()运算符 判断四种值类型 typeof 10; --> Number  ||   typeof &quo ...

  9. JS核心系列:浅谈原型对象和原型链

    在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function). 一般而言,通过new Function产生的对象是函数对象,其他对 ...

随机推荐

  1. ElasticSearch 6 安装、下载

    1,安装配置JDK 8 参考:官方文档 #为什么是JDK1.8?在ElasticSearch6.2.4中提到:JDK版本必须为:1.8.0_131 以上 > 1,安装JDK1.8-161 #解压 ...

  2. SQL-W3School-函数:SQL ROUND() 函数

    ylbtech-SQL-W3School-函数:SQL ROUND() 函数 1.返回顶部 1. ROUND() 函数 ROUND 函数用于把数值字段舍入为指定的小数位数. SQL ROUND() 语 ...

  3. 双缓冲技术局部更新原理之派生自View

    package com.loaderman.customviewdemo; import android.content.Context; import android.graphics.Canvas ...

  4. PHP判断是否在微信内部浏览器访问

    <?php if(is_weixin()){ echo "这是微信内部浏览器"; }else{ echo "这是微信外部浏览器"; } function ...

  5. osg fbx模型删除模型中的某几个节点,实现编辑模型的功能

    fbx model element count:80 三维视图: {三维} 4294967295 osg::MatrixTransform1 基本墙 wall_240 [361750] 4294967 ...

  6. 查看linux是几位操作系统

    查看linux是几位操作系统 摘自:https://blog.csdn.net/a34569345/article/details/80179927 2018年05月03日 14:44:44 bill ...

  7. sudo内容

    [root@bogon ~]# cat /etc/sudoers## Sudoers allows particular users to run various commands as## the ...

  8. pureftp 超时 mlsd

    问题起因,新项目搭建系统环境,ftp总有问题 能连接成功,但总是时好时不好,解决处理,忘有用 mlsd 超时列目录问题 (一会好一会不好) # a.指定被动端口中,如20000-60000,在ipta ...

  9. BS

  10. java输入输出 -- Java NIO之选择器

    一.简介 前面的文章说了缓冲区,说了通道,本文就来说说 NIO 中另一个重要的实现,即选择器 Selector.在更早的文章中,我简述了几种 IO 模型.如果大家看过之前的文章,并动手写过代码的话.再 ...