【原型模式】--重写原型对象prototype的影响
//【原型模式】--重写原型对象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的影响的更多相关文章
- [设计模式] JavaScript 之 原型模式 : Object.create 与 prototype
原型模式说明 说明:使用原型实例来 拷贝 创建新的可定制的对象:新建的对象,不需要知道原对象创建的具体过程: 过程:Prototype => new ProtoExam => clone ...
- 设计模式:原型模式介绍 && 原型模式的深拷贝问题
0.背景 克隆羊问题:有一个羊,是一个类,有对应的属性,要求创建完全一样的10只羊出来. 那么实现起来很简单,我们先写出羊的类: public class Sheep { private String ...
- 设计模式系列之原型模式(Prototype Pattern)——对象的克隆
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 原型模式 prototype 创建型 设计模式(七)
原型模式 prototype 意图 用原型实例指定需要创建的对象的类型,然后使用复制这个原型对象的方法创建出更多同类型的对象 显然,原型模式就是给出一个对象,然后克隆一个或者更多个对象 小时候看 ...
- 03 原型模式(prototype)
03 原型模式(prototype) 1 克隆羊问题 现在有一只羊tom,姓名为: tom.年龄为: 1,颜色为:白色,请编写程序创建和tom羊属性完全相同的10只羊. 2 传统方式解决 思路 cla ...
- 【UE4 设计模式】原型模式 Prototype Pattern
概述 描述 使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.如孙悟空猴毛分身.鸣人影之分身.剑光分化.无限剑制 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象, ...
- 设计模式_11_原型模式(prototype)深拷贝、浅拷贝
设计模式_11_原型模式(prototype) 浅拷贝: package designPatternOf23; /** * 定义:用原型实例,指定创建对象的种类,并通过拷贝这些原型创建新的对象 * P ...
- 设计模式-原型模式(Prototype)
场景分析: 前面我们提到,交易对象Trade,还有继承他的债券交易BondTrade.期货交易FutureTrade. 现在有一个需求,需要提供方法将交易拆分成多笔小交易. 代码如下(如果没有clon ...
- 原型模式--prototype
C++设计模式——原型模式 什么是原型模式? 在GOF的<设计模式:可复用面向对象软件的基础>中是这样说的:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.这这个定义中,最 ...
随机推荐
- linux安装后需要进行的一些基本设置
修改网络: 在终端中输入:vi /etc/sysconfig/network-scripts/ifcfg-ens33 然后重启网络服务:systemctl restart network.servic ...
- dll程序开发总结
1.修改生成的dll名称 VS2012中选中某个项目,项目--属性--配置属性--连接器--常规--输出文件
- 性能优化 | 30个Java性能优化技巧,你会吗?
在Java程序中,性能问题的大部分原因并不在于Java语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序性能. 1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间 ...
- ios UISegmentedControl 用法举例
UISegmentedControl * segmentControl = [[UISegmentedControl alloc]initWithFrame:CGRectMake(0, 0, 160, ...
- SQL-W3School-高级:SQL RIGHT JOIN 关键字
ylbtech-SQL-W3School-高级:SQL RIGHT JOIN 关键字 1.返回顶部 1. SQL RIGHT JOIN 关键字 RIGHT JOIN 关键字会右表 (table_nam ...
- 关于OpenCL中三重循环的执行次序
源自OpenGPU社区的一个帖子的讨论: 一个有意思的openCL问题
- 在Win7下玩PC游戏发生类似d3d9x_43.dll找不到的情况
由于d3d9x属于DirectX9.0c扩展,默认不会随系统安装.因此要快速修复这个问题可以去微软官网下载D3D驱动补丁. http://www.microsoft.com/zh-cn/downloa ...
- 【python】详解事件驱动event实现
[python]详解事件驱动event实现 所有的计算机程序都可以大致分为两类:脚本型(单次运行)和连续运行型(直到用户主动退出). 1.脚本型:脚本型的程序包括最早的批处理文件以及使用Python做 ...
- 实时流Streaming大数据:Storm,Spark和Samza
当前有许多分布式计算系统能够实时处理大数据,这篇文章是对Apache的三个框架进行比较,试图提供一个快速的高屋建瓴地异同性总结. Apache Storm 在Storm中,你设计的实时计算图称为top ...
- CF1183E/H Subsequences
思路: dp好题,dp[i][j]表示到前i个字符为止并且以s[i]为结尾,共有多少个长度为j的不同的子序列. 实现: #include <bits/stdc++.h> using nam ...