function foo的原型与prototype属性解惑

 更新时间:2010年11月19日 20:04:53   作者:  
最近在研究js,疑惑也比较多。主要是被原型这个东西给弄迷糊了。
疑惑出自于:
复制代码 代码如下:

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出来的新对象。

相关文章

  • 使用javascript实现简单的选项卡切换

    使用javascript实现简单的选项卡切换

    本文主要介绍了使用javascript实现简单的选项卡切换的效果,代码非常的简单,兼容性十分棒,这里推荐给小伙伴们。
    2015-01-01
  • 微信小程序 动态修改页面数据及参数传递过程详解

    微信小程序 动态修改页面数据及参数传递过程详解

    这篇文章主要介绍了微信小程序 动态修改页面数据及参数传递过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Bootstrap如何激活导航状态

    Bootstrap如何激活导航状态

    这篇文章主要为大家详细介绍了Bootstrap如何激活导航状态,包括胶囊式导航中的激活状态和列表导航中的激活状态,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • JavaScript运算符小结

    JavaScript运算符小结

    本文主要给大家详细总结了下javascript中的运算符,包括常见的算数运算符、比较运算符和逻辑运算符。十分的清晰,有需要的小伙伴可以参考下。
    2015-06-06
  • Bootstrap fileinput文件上传预览插件使用详解

    Bootstrap fileinput文件上传预览插件使用详解

    这篇文章主要为大家详细介绍了Bootstrap fileinput文件上传预览插件的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • JavaScript中的Proxy代理的用法和功能详解

    JavaScript中的Proxy代理的用法和功能详解

    Proxy代理是JavaScript中一项强大而灵活的功能,它可以用于拦截、修改和自定义对象的底层操作,这篇文章主要介绍了JavaScript中的Proxy代理的各种用法和功能,需要的朋友可以参考下
    2023-06-06
  • JavaScript中判断页面关闭、页面刷新的实现代码

    JavaScript中判断页面关闭、页面刷新的实现代码

    这篇文章主要介绍了JavaScript中判断页面关闭、页面刷新的实现代码,在一些特殊的场合中会用到这个技术,需要的朋友可以参考下
    2014-08-08
  • JS实现li标签的删除

    JS实现li标签的删除

    这篇文章主要为大家详细介绍了JS实现li标签的删除,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • ES6中export default和export之间的区别详解

    ES6中export default和export之间的区别详解

    export和export default都是es6语法中用来导出组件的,可以导出的文档类型有( 数据、常量、函数、js文件、模块等),下面这篇文章主要给大家介绍了关于ES6中export default和export之间的区别的相关资料,需要的朋友可以参考下
    2023-04-04
  • javascript模拟评分控件实现方法

    javascript模拟评分控件实现方法

    这篇文章主要介绍了javascript模拟评分控件实现方法,涉及javascript操作页面元素与样式的相关技巧,需要的朋友可以参考下
    2015-05-05

最新评论