//【原型模式】--重写原型对象prototype的影响 2014-12-12
//定义构造函数
function Person() { }
//直接指定构造函数的原型为一个对象(为了简化逐个给原型添加成员的操作),但是这样写带来了两个问题,我们先来看第一个问题:
Person.prototype = {
    name: "wede",
    age: 29,
    job: "SoftWare",
    say: function () {
        alert("Hello,I'm " + this.name + "," + this.age + " years old,i'm a " + this.job);
    }
};
//看看此时原型对象的constructor
document.write(Person.prototype.constructor + "<br/>"); //function Object() { [native code] }

//是Object
//这就意味着如果此时我们对其进行类型检测就会出问题,不会得到预期的类型Person,因为在上面prototype实际上是被重写了。
var person = new Person();
document.write(person.constructor + "<br/>"); //function Object() { [native code] },其实这里我们期望的是Person
document.write(person instanceof Person); //true

//解决办法:
Person.prototype = {
    constructor: Person, //重新指定其constructor属性
    name: "wede",
    age: 29,
    job: "SoftWare",
    say: function () {
        alert("Hello,I'm " + this.name + "," + this.age + " years old,i'm a " + this.job);
    }
};

//然后我们得到了预期的结果:
document.write(Person.prototype.constructor + "<br/>"); //function Person() { }
document.write(person.constructor + "<br/>"); //function Person() { }
document.write(person instanceof Person); //true

//即使这样,还是会有不足,那就是本来是不可枚举的constructor属性由于重设的缘故导致它的[[Enumerable]]内部特性变为了true,
//也就是说,现在遍历对象会包含constructor属性:
for (var prop in Person.prototype) {
    document.write(prop + ","); //constructor,name,age,job,say,
}
for (var prop in person) {
    document.write(prop + ","); //constructor,name,age,job,say,
}
//这里需要补充说明的是,使用for-in循环时,返回的是所有能够通过对象访问、可枚举的属性,其中既包括存在于实例中的属性,也包括存在于原型中的属性。《高三》P153
//目前只有针对ECMAScript 5的解决方案:即通过Object.definProperty()方法重新设置原型中的constructor属性。《高三》P156

//给prototype直接指定另一个对象带来的第二个问题:
//重写原型对象切断了现有原型与任何之前存在的对象实例之间的联系,因为实例引用的([[Prototype]])最初的原型。
//详见《高三》P156

【原型模式】--重写原型对象prototype的影响的更多相关文章

  1. [设计模式] JavaScript 之 原型模式 : Object.create 与 prototype

    原型模式说明 说明:使用原型实例来 拷贝 创建新的可定制的对象:新建的对象,不需要知道原对象创建的具体过程: 过程:Prototype => new ProtoExam => clone ...

  2. 设计模式:原型模式介绍 && 原型模式的深拷贝问题

    0.背景 克隆羊问题:有一个羊,是一个类,有对应的属性,要求创建完全一样的10只羊出来. 那么实现起来很简单,我们先写出羊的类: public class Sheep { private String ...

  3. 设计模式系列之原型模式(Prototype Pattern)——对象的克隆

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  4. 原型模式 prototype 创建型 设计模式(七)

    原型模式  prototype 意图 用原型实例指定需要创建的对象的类型,然后使用复制这个原型对象的方法创建出更多同类型的对象   显然,原型模式就是给出一个对象,然后克隆一个或者更多个对象 小时候看 ...

  5. 03 原型模式(prototype)

    03 原型模式(prototype) 1 克隆羊问题 现在有一只羊tom,姓名为: tom.年龄为: 1,颜色为:白色,请编写程序创建和tom羊属性完全相同的10只羊. 2 传统方式解决 思路 cla ...

  6. 【UE4 设计模式】原型模式 Prototype Pattern

    概述 描述 使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.如孙悟空猴毛分身.鸣人影之分身.剑光分化.无限剑制 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象, ...

  7. 设计模式_11_原型模式(prototype)深拷贝、浅拷贝

    设计模式_11_原型模式(prototype) 浅拷贝: package designPatternOf23; /** * 定义:用原型实例,指定创建对象的种类,并通过拷贝这些原型创建新的对象 * P ...

  8. 设计模式-原型模式(Prototype)

    场景分析: 前面我们提到,交易对象Trade,还有继承他的债券交易BondTrade.期货交易FutureTrade. 现在有一个需求,需要提供方法将交易拆分成多笔小交易. 代码如下(如果没有clon ...

  9. 原型模式--prototype

    C++设计模式——原型模式 什么是原型模式? 在GOF的<设计模式:可复用面向对象软件的基础>中是这样说的:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.这这个定义中,最 ...

随机推荐

  1. Flutter移动电商实战 --(15)商品推荐区域制作

    1.推荐商品类的编写 这个类接收一个List参数,就是推荐商品的列表,这个列表是可以左右滚动的. /*商品推荐*/ class Recommend extends StatelessWidget { ...

  2. JAVA的main方法

    在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方 法有很大的不同,比如方法的名字必须是main,方法必须 ...

  3. java 测试框架 TestNG

    Java中print.printf.println的区别 printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和prin ...

  4. Android中实现日期时间选择器(DatePicker和TimePicker)

    利用Android应用框架提供的DatePicker(日期选择器)和TimePicker(时间选择器),实现日期时间选择器. Dialog的Content布局文件(date_time_dialog.x ...

  5. 依赖注入之AutoFac

    一 .IoC框架AutoFac简介 IoC即控制反转(Inversion of Control),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(De ...

  6. centos7.5配置ntp时间服务器

    Centos7配置ntp时间服务器 Centos7配置时间服务器,一个服务端,多个客户端,客户端去同步服务端 服务端: 1.先修改时区,否则即使配置完ntp时间也不对,修改时区参照:https://w ...

  7. Django:(01) 关于什么是Django?

    一.从 WSGI 开始了解 Django 在了解 Django 之前有必要先了解一下 Python 被用于 Web 开发的基础协议——WSGI. 在开发 web 应用时,我们不希望接触到TCP连接.H ...

  8. Packages window(包窗口)

    使用Unity Package Manager(在Unity的顶层菜单中:Window > Package Manager)查看可以安装或已安装在Project中的软件包.此外,您可以使用此窗口 ...

  9. elasticsearch查询操作

    #查看节点信息 curl -X GET http://localhost:9200/_nodes #打开文件数信息 curl -X GET http://localhost:9200/_nodes/s ...

  10. zabbix案例实例

    1 案例1:实现Zabbix报警功能 1.1 问题 沿用第5天Zabbix练习,使用Zabbix实现报警功能,实现以下目标: 监控Linux服务器系统账户 创建Media,设置邮件服务器及收件人邮箱 ...