开发者社区> 问答> 正文

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


展开
收起
爱吃鱼的程序员 2020-06-10 10:25:00 686 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    第一个,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(){}
    很明显,prototype是给类增加一个方法,当然是类的实例对象才能调用这个方法。

    a.b();
    这行代码里,a是{b:b},所以实际执行了b函数,b函数里的this.c(),this指向a,而a是没有c方法的,自然会报错。
    我明白了,多谢你的解释

    引用来自“wuyiw”的评论

    第一个,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

    2020-06-10 10:25:18
    赞同 展开评论 打赏
问答分类:
问答地址:
相关产品:
问答排行榜
最热
最新

相关电子书

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