js caller的妙用以及new关键字与prototype的联系

/*********************第一个例子******************/
function test(){
    function b(){
        this.c();
    }
    b.prototype.c=function(){
        alert('worked!');
    }
    return b();
}

var c=function(){
    b=arguments.callee.caller;//在全局重新定义c防止test执行出错,然后保存b的引用
}
test();
new b();
/*********************第二个例子******************/
var a = function(){ 
    function b(){this.c()}
    b.prototype.c = function(){alert('worked!')}
    return {b:b};
}(); 
/**********错误的做法*************/
a.b();//这里会报错提示c不是一个方法,因为prototype是需要在一个函数对象创建的时候才会生成,
      //外层匿名函数执行了,但是b()却是没有实例化的,prototype对像都没有生成,当然c没有定义也不可能执行的。
      
/**********正确的做法*************/
new a.b(); //必须通过new关键字实例化,否则取不到c()的实例,因为c是通过prototype内建的
/*********************第三个例子******************/
var a2 = function(){
    return{
        b2:function(){
            this.c2();
        },
        c2:function(){
            alert('worked!');
        }
    } 
}();
a2.b2();//因为这里的c2不是通过prototype内建的,于是,a2对象里的b2函数是可以直接调用的。


转载于:https://my.oschina.net/codespring/blog/532090

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值