为什么要做A.prototype.constructor=A这样的修正?
问题
虽然看过这篇博文JavaScript prototype之后对原型理解不再那么模糊了,但是依然还有很多理解不甚透彻的地方。比如,今天看到一个原型式继承的例子,又有些困惑,于是找了些帖子看看,有了一些自己的理解,贴在这里,希望理解不对的地方大家可以帮我指出来,多谢了!
先看一段代码:
function Person(){
console.log("in 'Person'");
}
function Woman(){
console.log("in 'Woman'");
}
var woman=new Woman();//in 'Woman'
woman.constructor;//function Woman(){console.log("in 'woman'");}
var person=new Person();//in 'Person'
person.constructor;//function Person(){console.log("in 'person'");}
以上定义了两个function,各自实例化出一个对象后,在console中查看它们的constructor,一切正常。目前两个function之间还没有任何关系,下面用prototype让它们之间挂钩。设置Woman类的prototype是Person类,这个时候再来查看constructor的情况。
function Person(){
console.log("in 'Person'");
}
function Woman(){
console.log("in 'Woman'");
}
Woman.prototype=new Person();
var woman=new Woman();//in 'Woman'
/**constructor指向的是Person函数**/
woman.constructor;//function Person(){console.log("in 'person'");}
var person=new Person();//in 'Person'
person.constructor;//function Person(){console.log("in 'person'");}
可以看到woman的constructor指向了Person函数,这是为什么呢?
我的理解
我们知道,每个函数都有默认的prototype,这个prototype.constructor默认指向的就是这个函数本身。在未给Woman指定Person作为原型之前,Woman.prototype.constructor或者woman._proto_.constructor指向的就是Woman函数。但是当这样做之后:
Woman.prototype=new Person();
Woman函数的prototype被覆盖成了一个Person对象。
我们知道,constructor始终指向的是创建本身的构造函数,因此Woman.prototype.constructor自然就指向了创建Woman.prototype这个Person对象的函数,也就是Person函数。这样一来,woman对象的constructor指向就不对了,因此在网上大多关于原型继承的帖子里都会建议我们做这样的修改:
Woman.prototype.constructor=Woman;
var woman=new Woman();//in 'Woman'
woman.constructor;//function Woman(){console.log("in 'woman'");}
这样修正以后,constructor的指向就正确了。
但是,为什么要这样修正呢?不修正会有什么后果呢?
为何要做A.prototype.constructor=A这样的修正?
这是我最困惑的地方,因为我试验后发现,就算不做这样的修正,new Woman()的时候也不会有什么问题,虽然我还不理解JS是如何做到的,但是它确实找到了正确的构造函数去做实例化。最后我在stackoverflow上找到了一个回答What it the significance of the Javascript constructor property?,里面提到:
The constructor property makes absolutely no practical difference to anything internally. It's only any use if your code explicitly uses it. For example, you may decide you need each of your objects to have a reference to the actual constructor function that created it; if so, you'll need to set the constructor property explicitly when you set up inheritance by assigning an object to a constructor function's prototype property, as in your example.
所以,即使不做这样的修正也不会有什么影响,它主要防止一种情况下出错,就是你显式地去使用构造函数。比如,我并不知道woman是由哪个函数实例化出来的,但是我想clone一个,这时就可以这样:
var woman = new Woman();
...
...
...
var woman1 = woman.constructor();
为什么要做A.prototype.constructor=A这样的修正?的更多相关文章
- 深入理解Javascript中this, prototype, constructor
在Javascript面向对象编程中经常需要使用到this,prototype和constructor这3个关键字. 1.首先介绍一下this的使用:this表示当前对象;如果在全局中使用this,则 ...
- prototype/constructor/__proto__之constructor。
1.constructor的字面意思就是构造.它是对象的一个属性,它对应的值是该对象的“构造者” //一.构造函数实例化的对象的constructor function Cmf(n,m){ this. ...
- 原型模式Prototype,constructor,__proto__详解
最近由于在找工作,又拿起<JavaScript高级程序设计>看了起来,从中也发现了自己确实还是有很多地方不懂,刚刚看到原型模式这里,今天终于搞懂了,当然,我也不知道自己的理解是否有错. 1 ...
- javascript Prototype constructor的理解(转)
讲JS的构造的,这个比较清晰,但并不表示一定正确. 这几天一直在思考这个东东,感觉比以前理解更深入了. http://blog.csdn.net/chunqiuwei/article/details/ ...
- 彻底搞懂js __proto__ prototype constructor
在开始之前,必须要知道的是:对象具有__proto__.constructor(函数也是对象固也具有以上)属性,而函数独有prototype 在博客园看到一张图分析到位很彻底,这里共享: 刚开始看这图 ...
- prototype constructor __proto__
constructor, prototype, __proto__ 详解
- js中__proto__和prototype constructor 的区别和关系
https://www.zhihu.com/question/34183746 javaScript原型.原型链的定义? prototype:每个函数都有一个prototype(显式原型),这个属性是 ...
- Object.prototype.constructor
Returns a reference to the Object function that created the instance's prototype. 注意这个属性的值是函数本省的引用,而 ...
- 深入剖析JavaScript中的数据类型判断(typeof instanceof prototype.constructor)
关于JavaScript中的类型判断,我想大部分JavaScripter 都很清楚 typeof 和 instanceof,却很少有人知道 constructor,以及constructor与前面二 ...
随机推荐
- pgm9
这部分介绍 sampling 方法,书上也称为 particle-based method,这是因为每一个从分布中采集到的样本可以看成是一个 particle(instantiation of r.v ...
- Mobile Phone Network CodeForces - 1023F(并查集lca+修改环)
题意: 就是有几个点,你掌控了几条路,你的商业对手也掌控了几条路,然后你想让游客都把你的所有路都走完,那么你就有钱了,但你又想挣的钱最多,真是的过分..哈哈 游客肯定要对比一下你的对手的路 看看那个便 ...
- 【题解】 [HNOI2015]落忆枫音 (拓扑排序+dp+容斥原理)
原题戳我 Solution: (部分复制Navi_Aswon博客) 解释博客中的两个小地方: \[\sum_{\left(S是G中y→x的一条路径的点集\right))}\prod_{2≤j≤n,(j ...
- 【洛谷P2114】起床困难综合征 位运算+贪心
题目大意:给定 N 个操作,每个操作为按位与.或.异或一个固定的数字,现在要求从 0 到 M 中任选一个数字,使得依次经过 N 个操作后的值最大. 题解:位运算有一个重要的性质是:位运算时,无进位产生 ...
- SQL Server 事务与隔离级别实例讲解
上班途中,你在一处ATM机前停了下来.正当你在敲入密码的时候,你的一位家人也正在镇上的另一处TAM机上输入密码.你打算从某个还有500元余额的账户上转出400元,而你的家人想从同一账户取走300元.倘 ...
- webpack开发小总结
webpack开发前端的时候往往是单独自己的服务器: 1.express 带上 webpack-dev-middleware(自己实现了热更新,而且在memory-fileSystem,不会产生多余文 ...
- github 远程仓库
因为本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以设置一下 第1步:创建SSH Key.在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_r ...
- Jerasure库简介及使用范例
刚刚写这篇文章之前看了下上一篇博客的时间:2013年7月19日.居然已经过了3个月了!好快!感叹时间的同时不由的又感叹了下自己的懒惰,其实仔细想想,这段时间自己也做了很多事情: 完成了一篇副本同步相关 ...
- js星星评分插件
下载:https://files.cnblogs.com/files/wordblog/%E6%98%9F%E6%98%9F%E6%8F%92%E4%BB%B6.rar
- 通俗理解决策树中的熵&条件熵&信息增益
参考通俗理解决策树算法中的信息增益 说到决策树就要知道如下概念: 熵:表示一个随机变量的复杂性或者不确定性. 假如双十一我要剁手买一件衣服,但是我一直犹豫着要不要买,我决定买这件事的不确定性(熵)为2 ...