对于每个构造函数来说,都有一个prototype属性。对于每个对象实例来说,都有_proto_属性。

参看下面代码:

function Person(){}
Person.prototype={
name:"Mike",
age:18,
sayName:function(){
alert(this.name);
}
}; var friend = new Person();
alert(friend instanceof Person);//true
alert(friend.constructor == Person);//false
alert(friend.constructor == Object);//true

由于重写了Person.prototype,friend.constructor不再指向Person了。这个问题可以通过在Person.prototype中添加constructor:Person来避免,但是这也会导致constructor变为可列举的属性。

参看下面代码:

function Person(){}
var friend = new Person();
Person.prototype=
{
constructor:Person,
name:"Mike",
age:18,
sayName:function(){
alert(this.name);
}
};

调用friend.sayName()的结果是什么?

会报错。 为什么?

重写原型对象切断了现有原型与之前任何原型对象实例之间的联系。

参看下面的代码:

function Person(){}

Person.prototype=
{
constructor:Person,
name:"Mike".
age:18;
friends:["Tom","Rose"],
sayName:function(){
alert(this.name);
}
}; var person1 = new Person();
var person2 = new Person(); person1.friends.push("Van");
alert(person2.friends);
alert(person1.friends==person2.friends);

原型对象中的引用类型的属性,对于每个实例来说也都是共享的。

类似问题在原型模式的继承中也会体现:

function SuperType(){
this.colors=["red","blue","green"];
}
function SubType(){} SubType.prototype = new SuperType(); var instance1 = new SubType();
instance1.colors.push("black");
alert(instance1.colors);//red,blue,green,black var instance2 = new SuperType();
alert(instance2.colors);//red,blue,green,black

prototype原型模式中的问题的更多相关文章

  1. 设计模式(1)--Prototype(原型模式)--创建型

    1.模式定义: 原型模式就是用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象. 2.使用场景: 在原型模式中我们可以利用过一个原型对象来指明我们所要创建对象的类型,然后通过复制这个对象的 ...

  2. Prototype原型模式(创建型模式)

    1.原型模式解决的问题 现在有一个抽象的游戏设施建造系统,负责构建一个现代风格和古典风格的房屋和道路. 前提:抽象变化较慢,实现变化较快(不稳定) 整个抽象的游戏设施建造系统相对变化较慢,本例中只有一 ...

  3. 设计模式05: Prototype 原型模式(创建型模式)

    Prototype 原型模式(创建型模式) 依赖关系的倒置抽象不应该依赖于实现细节,细节应该依赖于抽象.对所有的设计模式都是这样的. -抽象A直接依赖于实现细节b -抽象A依赖于抽象B,实现细节b依赖 ...

  4. 一天一个设计模式——Prototype 原型模式

    一.模式说明 看了比较多的资料,对原型模式写的比较复杂,个人的理解就是模型复制,根据现有的类来直接创建新的类,而不是调用类的构造函数. 那为什么不直接调用new方法来创建类的实例呢,主要一个原因是如果 ...

  5. 7、Prototype 原型模式 通过复制创造实例 创造型模式

    2020-07-19 发哥讲 发哥讲 其实上一节的末尾讲到如何去生成对象,其中有一个关于clone的,这其实就是Prototype原型模式. 通过克隆(拷贝)的方式生成对象 1.了解Prototype ...

  6. C++设计模式-Prototype原型模式

    作用: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. Prototype模式提供了一个通过已存在对象进行新对象创建的接口(Clone), Clone()实现和具体的语言相关,在C+ ...

  7. Prototype 原型模式

    用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式即在运行时动态的通过一个对象的实例来创建这个类的对象,可以理解成通过一个实例克隆出另一个实例. Prototype模式的一些优 ...

  8. 设计模式(五):PROTOTYPE原型模式 -- 创建型模式

    1.定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.适用场景 原型模式的主要思想是基于现有的对象克隆一个新的对象出来,一般是有对象的内部提供克隆的方法,通过该方法返回一个对 ...

  9. 面向对象设计模式纵横谈:Prototype 原型模式(笔记记录)

       有一段时间没写东西了,今天继续把没写完的设计模式写完,今天这堂课是创建型设计模式的最后一堂课,原型设计模式,它同样也是解决了对象在创建的过程中的解耦合的情况,面对变化使代码更稳定,更准确的说是使 ...

随机推荐

  1. strong标签与b标签的区别

    关于html标签中b和strong两个的区别. 用在网页上,默认情况下它们起的均是加粗字体的作用,二者所不同的是,<b>标签是一个实体标签,它所包围的字符将被设为bold(粗体),而< ...

  2. window下部署php_redis扩展

    关于redis的一些特性就不多说了,可以到这里去了解,or click me. 另外,给出一个redis中文API,点我. 首先要下载一个redis软件,可以到官网下载. 注意:官网提供的版本比较高级 ...

  3. VisualStudio Form文件构成说明

    创建一个窗体Form1.cs 后,在他的下一级,有两个子文件: Form1.Designer.cs 和Form1.resx 这两个子文件 Form1.Designer.cs是VS自动生成用作UI的绘制 ...

  4. JavaScript中Eval()函数的使用

    Eval()常用的几种形式 1.我们预先不知道要执行什么语句,只有当条件和参数给时才知道执行什么语句,这时候eval就派上用场了. function output(a, b) { var tmpa, ...

  5. C# 多线程网络通信

    博客园 :梦工厂2012 本月由于事情太多,没能有太多的时间去写博客.不过还好在月底抽时间写了这个多线程网络通信的程序 .程序说明:控制端 创建一个写线程threadWrite和一个读线程thread ...

  6. hibernateUtils

    hibernate3.x版本 package hibernate_01; import org.hibernate.Session; import org.hibernate.SessionFacto ...

  7. NeHe OpenGL教程 第二十五课:变形

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  8. Existence and nonexistence results for anisotropic quasilinear elliptic equations

    Fragalà, Ilaria; Gazzola, Filippo; Kawohl, Bernd. Existence and nonexistence results for anisotropic ...

  9. ylbtech-dbs:ylbtech-1,FAM(家庭资产管理系统)

    ylbtech-dbs:ylbtech-1,FAM(家庭资产管理系统) -- =============================================-- Family Assets ...

  10. CentOS安装apache2(转载)

    From:http://www.onepx.com/centos-apache-246.html 之前服务器 Apache 版本一直是 2.2.x,鉴于 Centos 更新软件的惰性,我看直到 201 ...