浏览 2376 次
锁定老帖子 主题:判断函数是new还是()调用
该帖已经被评为隐藏帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-01-19
最后修改:2011-04-03
具名函数的各种调用方式
在一年前已经总结过了。
方式1 function Person(n,a){ this.name = n; this.age = a; if(this instanceof Person){ alert('这是new调用'); }else{ alert('这是普通函数调用'); } } var p = new Person('jack',30); // --> 这是new调用 Person(); // --> 这是普通函数调用
方式2 function Person(n,a){ this.name = n; this.age = a; if(this instanceof arguments.callee){ alert('这是new调用'); }else{ alert('这是普通函数调用'); } } var p = new Person('jack',30); // --> 这是new调用 Person(); // --> 这是普通函数调用 方式3 function Person(n,a){ this.name = n; this.age = a; if(this.constructor === arguments.callee){ alert('这是new调用'); }else{ alert('这是普通函数调用'); } } var p = new Person('jack',30); // --> 这是new调用 Person(); // --> 这是普通函数调用
看似很完美,但当把函数/类作为自身实例对象的方法时调用就出问题了 function Person(n,a){ this.name = n; this.age = a; if(this.constructor === arguments.callee){ alert('这是new调用'); }else{ alert('这是普通函数调用'); } } var p = new Person('jack',30); // 先new一个对象 p.fn = Person; // 把函数/类 Person 赋值给自身对象p的fn属性 p.fn(); // 这句调用时提示“这是new调用”,显然不对 呃,还有更好的方法吗?
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-01-20
不是很清楚这样的用意,但你可以这样试试: if((this instanceof Person)&&!this.name){ alert('这是new调用'); }else{ alert('这是普通函数调用'); } this.name = n; this.age = a; |
|
返回顶楼 | |
发表时间:2011-01-20
补充:
if((this instanceof Person)&&this.name===undefined){ alert('这是new调用'); }else{ alert('这是普通函数调用'); } this.name = n; this.age = a; |
|
返回顶楼 | |
发表时间:2011-01-20
最后修改:2011-01-20
to houfeng0923:
new Person(); 时就不行了。 谢谢你,但似乎无解。 |
|
返回顶楼 | |
发表时间:2011-01-24
可以判断的,情况分支比较多。
你看我blog里的这篇吧: “函数中判断自己是以怎样的形式被调用的” http://blog.csdn.net/cuixiping/archive/2011/01/24/6160456.aspx ![]() |
|
返回顶楼 | |
发表时间:2011-01-25
不明白应用场景,为嘛要知道?
|
|
返回顶楼 | |
发表时间:2011-01-25
无解。
new的作用提供一个Person.prototype的复制,以此为基础来调用Person()方法。 假设Person里什么都没做。 new Person()出来的p和复制出来的obj没有任何区别。所以在这2个上面调用constructor,也就是Person函数,没有区别。 |
|
返回顶楼 | |