js中的prototype在什么时候创建?报错-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

js中的prototype在什么时候创建?报错

爱吃鱼的程序员 2020-06-10 10:25:00 82
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,为什么就没有报错呢?


JavaScript
分享到
取消 提交回答
全部回答(1)
  • 爱吃鱼的程序员
    2020-06-10 10:25:18

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

    0 0
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题
推荐课程