var a = function(){ function b(){this.c()} b.prototype.c = function(){alert('worked!')} return {b:b}; }(); a.b();
这段代码会报错:this.c is not a function! 因为prototype只有在一个函数对象创建的时候才会生成,没用new关键字实例化b就直接调用定义在b原型上的方法自然会报错。但下面的代码为什么就不报错呢?
var a = function(){ function b(){this.c()} b.prototype.c = function(){alert('worked!')} return {b:b}; }(); //a.b();/*不在实例化前直接调用原型上的方法*/ var d=function(){} d.prototype=a.b.prototype;/*原型赋值*/ var e=new d(); e.c();/*这里不再报错了*/
这里是把b的原型赋值给了一个新的对象,接着实例化新的对象( 也没有实例化b)后调用c,为什么就没有报错呢?
第一个,a.b()仅仅是调用了b函数,函数里面的this指向a,而a没有c,所以报错.[1](你可以试试在return {b:b};里面加个c看看)
第二个,vare=newd()时,步骤如下:[2]
1,创建一个空object;
2,新object继承d的prototype,即a.b.prototype,c就是从这里进来的;
3,在新object上执行d的constructor,即vard=function(){}里面的function(){};
4,如果constructor返回一个object,则返回这个object,否则返回1里面新建的object,返回的值赋给e.
于是e.c()就调用了prototype里面的c.
参考:
[1]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this
[2]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new
Class.prototype.fn=function(){}第一个,a.b()仅仅是调用了b函数,函数里面的this指向a,而a没有c,所以报错.[1](你可以试试在return {b:b};里面加个c看看)
第二个,vare=newd()时,步骤如下:[2]
1,创建一个空object;
2,新object继承d的prototype,即a.b.prototype,c就是从这里进来的;
3,在新object上执行d的constructor,即vard=function(){}里面的function(){};
4,如果constructor返回一个object,则返回这个object,否则返回1里面新建的object,返回的值赋给e.
于是e.c()就调用了prototype里面的c.
参考:
[1]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this
[2]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。