初学,关于javascript的问题?

菜鸟一枚,刚学javascript,有个实例化对象的问题想问一下各位:

function b() {
    alert(1);
}
 var a = new b();
 alert(a());
function b() {
    alert(1);
}
 var a = new b();
 alert(a);

我想要实例化函数b然后输出1,但是上面两种都不行,请问为啥。。第一种在浏览器上报错,第二种是Object object/(ㄒoㄒ)/~~

阅读 2k
3 个回答

你是没搞清楚new是什么意思,继承相关的内容:

new实际上在构造函数运行时继承了父级的原型对象的同时改变了this指向:

var obj={};
obj._proto_=Father.propotype; //原型继承
Father.call(obj); //改变this指向
return obj;

就是说 a= new b();new b()执行完的会返回一个对象给a,应为b里面什么属性方法也没写,
所以在弹出1之后,a只得到的一个空对象{};所有alert(a);就是[object object];
alert(a());//这个肯定报错啊,a是个对象,不是函数。

继承这块不太好懂,慢慢来吧

??????????
第二种不会报错啊

应该是第一个会报错吧,因为a不是一个函数,会报typeerror。
首先要了解的概念是new操作究竟做了什么,它返回的是什么。下面是一个简单实现new函数。

const myNew = function(fn, ...args) {
  let obj = {};
  obj.__proto__ = fn.prototype;
  let ret = fn.call(obj, ...args);
  return typeof ret === "object" ? ret : obj;
};

我们可以看到返回的是一个对象或者函数的return结果。

了解了这些就好办了。

function b() {
    return () => 1
}
let a = new b();
alert(a())
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题