【原型模式】--重写原型对象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的<设计模式:可复用面向对象软件的基础>中是这样说的:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.这这个定义中,最 ...
随机推荐
- benchmark在postgresql上的安装及使用
BenchmarkSQL是一款经典的开源数据库测试工具,内嵌了TPCC测试脚本,可以对EnterpriseDB.PostgreSQL.MySQL.Oracle以及SQL Server等数据库直接进行 ...
- Unix/Linux下如何查看DNS服务器地址
使用命令: cat /etc/resolv.conf 或者 less /etc/resolv.conf 即可. 详细请见:http://www.cyberciti.biz/faq/how-to-fin ...
- C# DumpBin使用 查看反射C++ dll 动态链接库中的函数
DumpBin是Microsoft提供的一个用于查看.exe..dll文件信息的工具,其位于: C:\Program Files (x86)\Microsoft Visual Studio 10.0\ ...
- [Scikit-learn] 1.5 Generalized Linear Models - SGD for Classification
NB: 因为softmax,NN看上去是分类,其实是拟合(回归),拟合最大似然. 多分类参见:[Scikit-learn] 1.1 Generalized Linear Models - Logist ...
- JAVA 基础编程练习题30 【程序 30 插入数字】
30 [程序 30 插入数字] 题目:有一个已经排好序的数组.现输入一个数,要求按原来的规律将它插入数组中. 程序分析:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入后此元素之后的 ...
- 在linux下php挂接mysql.so扩展的方法
第一步:进入php源码中的"ext/mysql"目录下命令:cd 第二步:在当前目录下运行phpize 命令:/usr/local/php524/bin/phpize phpize ...
- C-Lodop提示Access violation at address ...in module 'CLodopPrint32.exe' write of address
C-Lodop提示 Access violation at address ……in module 'CLodopPrint32.exe' write of address ……最近遇到了个问题,上午 ...
- Flutter 贝塞尔曲线切割
现在人们对于网站的美感要求是越来越高了,所以很多布局需要优美的曲线设计.当然最简单的办法是作一个PNG的透明图片,然后外边放一个Container.但其内容如果本身就不是图片,只是容器,这种放入图片的 ...
- Jmeter 逻辑控制器 之 ForEach 控制器
一.认识 ForEach 控制器 如下,创建一个 ForEach 控制器 设置界面如下: 输入变量前缀:要进行循环读取的变量前缀 Start index for loop (exclusive):循环 ...
- 关于RNN(Recurrent Neural Network)的一篇文章
文章链接:https://blog.csdn.net/zhaojc1995/article/details/80572098 写的很好!