日期:2014-05-16  浏览次数:20355 次

构造函数外给prototype赋值才能即时绑定?
本帖最后由 u010090753 于 2013-05-03 15:08:05 编辑
如果把给prototypr赋值放在构造函数里面,new出来的时候 就没有效果


要放在外面,才有效果



这是书里的说法,为什么放在外面就能即时绑定,放在里面就不行呢,为什么叻为什么叻为什么叻
是我钻牛角尖了吗

还是说 根据原型的某个设定 其实是有个说法来解释的

下面的说明只是阐明了这个现象,也没有说出原因何在,为什么叻为什么叻
里面不是也有个if语句去判断,为什么第一次实例化就没有把这段代码考虑进去


------解决方案--------------------
(1)创建一个新的对象,并让 this 指针指向它;

(2)将函数的 prototype 对象的所有成员都赋给这个新对象;

(3)执行函数体,对这个对象进行初始化操作;

(4)返回(1)中创建的对象。

new的时候大概执行了上面的那些操作,纯属从别地方抄的,。。

不要问我为什么是先2再3,,你的代码已经证明了确实是先2再3.。

------解决方案--------------------
prototype本身就是在创建时使用的,而不是在运行的时候调用,当然要用也是可以,只是没有必要

如果要在运行的时后新增方法就可以这样:
function A() {
    this.showName = function() {
        // ...
    }
}

------解决方案--------------------
原型链运行机制要理解需要相当的js基础
prototype上的成员和构造出的对象上的成员不是一回事
对象构造的过程是构造一个新对象并用新对象调用构造函数,但原型链上的成员并没有添加到对象上
当访问对象成员时,先从对象自身查找该成员,若无再从其构造函数的prototype属性上查找,若无则查找Object的prototype,若仍然无则为undefined

你这儿的问题是第一次构造时把原型链重置了,但该对象的原型对象在构造时已指定,这就造成对象上的原型与该函数当前的原型不是同一个对象,自然找不到新原型链上的成员。第二次调用的话将回复正常

修改方法时不要重置对象,只是添加成员而已

if(!A._init_) {
    A.prototype.showName = function(){
        return this.name;
    }
}
这样就可以了



------解决方案--------------------

又是原型的问题..哥只能再次拿出真藏的帖子了..
http://www.cnblogs.com/RicCC/archive/2008/02/15/JavaScript-Object-Model-Execution-Model.html
看去吧..讲的很详细..你理解了就明白了你的问题了