开发者社区> 问答> 正文

js中的prototype在什么时候创建

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,为什么就没有报错呢?

展开
收起
a123456678 2016-07-15 16:29:12 2173 0
1 条回答
写回答
取消 提交回答
  • 第一个, 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.

    2019-07-17 19:57:14
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
JavaScript函数 立即下载
Delivering Javascript to World 立即下载
编程语言如何演化-以JS的private为例 立即下载