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
第二个, var e=new d()时, 步骤如下:[2]
1,创建一个空object;
2, 新object继承d的prototype, 即a.b.prototype, c就是从这里进来的;
3, 在新object上执行d的constructor, 即var d=function(){} 里面的function(){};
4, 如果constructor返回一个object, 则返回这个object, 否则返回1里面新建的object, 返回的值赋给e.
于是e.c()就调用了prototype里面的c.
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。