为什么是0? 和30?

1.下面程序执行后弹出什么样的结果?
function fn() {
            this.a = 0;
            this.b = function() {
                alert(this.a)
            }
        }
        fn.prototype = {
            b: function() {
                this.a = 20;
                alert(this.a);
            },
            c: function() {
                this.a = 30;
                alert(this.a);
            }
        }
        var myfn = new fn();
        myfn.b(); //0?
        myfn.c(); //30?

分析一下 谢谢!

阅读 2.2k
3 个回答

对象方法的优先级比原型方法要高,看例子:

    function People(){
      //对象方法
      this.show = function(){
        alert('对象方法');
      }
    }

    //类方法
    People.show = function(){
      alert('类方法');
    }

    //原型方法
    People.prototype.show = function(){
      alert('原型方法');
    }

    var p = new People();
    p.show();

打印结果:对象方法

推荐一篇文章:JS中的prototype,可以加深对prototype的理解

函数运行时会先去本体的函数中去找,如果找到则运行,找不到则去prototype中寻找函数。

函数执行前期初始化变量环境走了如下过程:
1、遍历参数列表,添加到函数变量环境并赋值。
2、遍历函数声明,如果函数变量环境中存在则赋值,不存在则添加并赋值。
3、添加arguments并赋值【这里不同浏览器表现差异较大,并不一定都是这样】
4、遍历函数中所有的变量声明,如果变量环境中存在则不作任何操作,不存在则添加并赋值undefined。

http://www.cnblogs.com/huzhim...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题