作家
登录

function foo的原型与prototype属性解惑

作者: 来源:www.28hudong.com 2013-03-30 01:10:57 阅读 我要评论

疑惑出自于: 复制代码 代码如下: function foo {   this.name = 'foo'; } alert(foo.prototype === Function.prototype ); //false。 当时一直没想明白为啥foo的原型不是Function.prototype。 下面例子让我想当然的认为o.prototype === Function.prototype 应该为true的: 复制代码 代码如下: function foo() {   this.name = 'foo'; } Function.prototype.sayHello = function (parent) {   alert('hello'); }; foo.sayHello(); //alert 'hello' 当我给Function.prototype增加了一个sayHello的方法后,foo也从原型身上得到了sayHello。用调试器观察了一下,查了一下资料(包括ECMA-262 http://dmitrysoshnikov.com/ecmascript/chapter-5-functions/ 以及 《JavaScript the good parts》第五章5.1 Pseudoclassical) ,发现foo.prototype的定义如下: this.prototype = {constructor: this}; //这里是foo.prototype = {constructor: foo}; 顺便做了以下测试 alert(foo === foo.prototype.constructor); //true 那foo.prototype到底是什么?这跟new关键字有密切的关系。说一下new foo()干了些什么就知道了。 var obj = {}; //定义一个新的Object obj.[[prototype]] == this.prototype; //注意1:此处的this为foo,foo.prototype此时有用武之地了,给obj的原型赋值,在此用[[prototype]]表示其原型 //注意2:obj是没有prototype属性的,估计是没用吧 var other = this.apply(obj, arguments); //这部让obj.name = 'foo',即obj作为this跑了一遍foo函数 return (typeof other === 'object' && other) || that; //如果foo函数返回了一个对象,则返回该对象,否则返回obj。 这样就很清楚了,new foo()的时候,foo创建了一个对象,并作为其构造函数,而foo.prototype则作为新对象的原型来使用。 foo.prototype可以添加任意方法,或改为任意的对象,而不怕修改了Function.prototype(Function.prototype是所有函数的原型); this.prototype = {constructor: this};的意义就在于,在没有手动指定foo.prototype的情况下,js指定了一个默认的原型给new出来的新对象。

  推荐阅读

  jQuery 定时局部刷新(setInterval)

复制代码 代码如下:<head> <script src="jQuery/jquery-1.4.1.min.js" type="text/javascript"></script> <script> $(document).ready(function () { setInterval("startRequest()",1000); }); function startRequ>>>详细阅读


本文标题:function foo的原型与prototype属性解惑

地址:http://www.17bianji.com/kaifa2/JS/25405.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)