原型陷阱:
在处理原型问题上时,我们要注意两种行为。
1. 当我们对原型对象执行完全替换的时候,有可能会触发原型链的某种异常。
2. prototype.constructor 属性是不可靠的。
下面,我们新建一个构造函数,并创建两个对象:
var her = fucntion(){ this.name = 'Anna'; } var she1 = her(); var she2 = her();
即使在对象she1和she2对象被创建之后,我们仍然可以对her()的原型添加属性,并且之前创建的这些对象也可以访问这些属性。
her.prototype.say = function(){ return 'Hello' } she1.say(); // Hello she2.say(); // Hello
如果我们检查一下这些对象的构造函数,会发现一切正常:
she1.constructor === her; // true she2.constructor === her; // true
现在,我们用一个新对象覆盖掉该构造函数的原型对象:
her.prototype = { sex : 'women', height : '170cm' }
事实证明,原有对象不能访问这些新增属性了,但原有对象们与她们的构造函数还保持着一种神秘的联系:
she1.sex; // undefinedshe1.say(); // Hello
而我们之后创建的对象使用的或访问的都是更新过后的prototype对象。
var a = her(); a.say(); // a.say() is not defined; a.sex = 'women';
这时候,新对象的constructor就不会在指向her()了,而是指向Object().
a.constructor; // function Object(){}she1.constructor; // function her(){this.name = 'Anna'}
当然我们可以设置constructor属性的指向来解决上述异常:
function her(){}; her.prototype = {}; new her().constructor === her; // false her.prototype.constructor = her; new her().constructor === her; // true
当我们重写prototype对象的时候,一定要重置prototype的constructor属性。
就是辣么酸爽
javascript --- 原型初探七日谈(三)的更多相关文章
-
javascript --- 原型初探七日谈(一)
在javascript中,像原型,闭包这样的概念,只要我们能领悟其中的原理,一切都会显得格外清晰与明了. 原型属性(prototype): 下面我们简单定义一个函数 function her(a, b ...
-
javascript --- 原型初探七日谈(二)
扩展内建对象: 在javascript中,内建对象的构造函数都是可以通过其原型来进行扩展的.这意味着我们可以做一些事情,例如我们要往数组原型中添加一个新方法,就可以在其所有的数组中使用,下面我们来试试 ...
-
javascript --- 继承初探七日谈 (一)
原型链是javascript实现继承的默认方式.下面来一个例子看一下她的魔法吧: 首先定义三个构造函数: function her(){ this.name = 'Anna'; this.toStri ...
-
javascript 函数初探 (三)--- javascript 变量的作用域
javascript 变量的作用域: 这是一个至关重要的问题.特别是当我们从别的语言转向javascript时,必须要明白一点,即在javascript中,变量的定义并不是以代码块作为作用域的,而是以 ...
-
javascript 对象初探 (三)--- 传递/比较对象
传递对象 当我们拷贝某个对象或者将对象传递给某个函数时,往往传递的都是该对象的引用.因此我们在该对象的引用上做任何改动,实际上都会影响到引用的原对象. var she = {num:1}; var h ...
-
浅谈系列之 javascript原型与对象
在我学习与使用javascript三个月中,我一直对javascript的继承关系以及prototype理解不清,导致很多时候为什么这么用说不出个所以然来.截止到本周为止,通过之前的学习以及自己的再学 ...
-
JavaScript原型OOP——你上车了吗?
.title-bar { width: 80%; height: 35px; padding-left: 35px; color: white; line-height: 35px; font-siz ...
-
Javascript模块化编程(三):require.js的用法
Javascript模块化编程(三):require.js的用法 原文地址:http://www.ruanyifeng.com/blog/2012/11/require_js.html 作者: 阮一峰 ...
-
Javascript基础回顾 之(三) 面向对象
本来是要继续由浅入深表达式系列最后一篇的,但是最近团队突然就忙起来了,从来没有过的忙!不过喜欢表达式的朋友请放心,已经在写了:) 在工作当中发现大家对Javascript的一些基本原理普遍存在这里或者 ...
随机推荐
-
mysql技术点1.-----------查询当天的所有数据
select xs.* from xn_supervision xs where xs.task_type="+taskType+" and xs.create_time&g ...
-
linux下搭建nagios
配置环境:1)CentOS 6.5 作为监控主机,IP:10.0.0.30(根据自己公司需要改变) 2)客户机: windows server 2008R2 , windows 7, windows ...
-
三进制状压 HDOJ 3001 Travelling
题目传送门 题意:从某个点出发,所有点都走过且最多走两次,问最小花费 分析:数据量这么小应该是状压题,旅行商TSP的变形.dp[st][i]表示状态st,在i点时的最小花费,用三进制状压.以后任意进制 ...
-
js onmouseleave
onmouseleave no propagation onmouseout will propagation
-
Java 8 VM GC Tuning Guide Charter2
第二章 Ergonomics Ergonomics is the process by which the Java Virtual Machine (JVM) and garbage collect ...
-
SQL SERVER字符串函数
本篇文章还是学习<程序员的SQL金典>内容的记录,此次将讲解的是SQL SERVER的字符串函数. 其实数据库跟程序语言库一样,都会集成很多可以使用的API.这些API,如果你熟悉的话,将 ...
-
CSS传统布局之布局模型
刚开始准备这篇文章的时候,查到的有很多包含“布局模型”的中文博客或是资料,但是google上并未找到类似字眼,google到的是“flex layout module”“grid layout mod ...
-
Spring Security 源码解析(一)AbstractAuthenticationProcessingFilter
# 前言 最近在做 Spring OAuth2 登录,并在登录之后保存 Cookies.具体而言就是 Spring OAuth2 和 Spring Security 集成.Google一下竟然没有发现 ...
-
知识小罐头07(tomcat8请求源码分析 下)
感觉最近想偷懒了,哎,强迫自己也要写点东西,偷懒可是会上瘾的,嘿嘿!一有写博客的想法要赶紧行动起来,养成良好的习惯. ok,继续上一篇所说的一些东西,上一篇说到Connector包装了那两个对象,最后 ...
-
【Teradata System】How Teradata uses MPP Systems
内存分配 内存初始化时将分配给操作系统和Vprocs,内存不使用部分的90%做为FSG (File Segment Cache) ,由PDE对FSG进行管理. FSG Cache:缓存常驻内存的dat ...