具名函数的各种调用方式
在一年前已经总结过了。
这篇看看如何判断一个函数是被new调用的,还是被其它方式调用的。
?
方式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调用”,显然不对?
呃,还有更好的方法吗?
?
?
1 楼
houfeng0923
2011-01-20
不是很清楚这样的用意,但你可以这样试试:
if((this instanceof Person)&&!this.name){ alert('这是new调用'); }else{ alert('这是普通函数调用'); } this.name = n; this.age = a;
2 楼
houfeng0923
2011-01-20
补充:
if((this instanceof Person)&&this.name===undefined){ alert('这是new调用'); }else{ alert('这是普通函数调用'); } this.name = n; this.age = a;
3 楼
zhouyrt
2011-01-20
to houfeng0923:
new Person(); 时就不行了。
谢谢你,但似乎无解。
new Person(); 时就不行了。
谢谢你,但似乎无解。
4 楼
cuixiping
2011-01-24
可以判断的,情况分支比较多。
你看我blog里的这篇吧:
“函数中判断自己是以怎样的形式被调用的”
http://blog.csdn.net/cuixiping/archive/2011/01/24/6160456.aspx
你看我blog里的这篇吧:
“函数中判断自己是以怎样的形式被调用的”
http://blog.csdn.net/cuixiping/archive/2011/01/24/6160456.aspx
5 楼
goldduck
2011-01-25
不明白应用场景,为嘛要知道?
6 楼
dojotoolkit
2011-01-25
无解。
new的作用提供一个Person.prototype的复制,以此为基础来调用Person()方法。
假设Person里什么都没做。
new Person()出来的p和复制出来的obj没有任何区别。所以在这2个上面调用constructor,也就是Person函数,没有区别。
new的作用提供一个Person.prototype的复制,以此为基础来调用Person()方法。
假设Person里什么都没做。
new Person()出来的p和复制出来的obj没有任何区别。所以在这2个上面调用constructor,也就是Person函数,没有区别。