方式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調用”,顯然不對
還有更好的方法嗎?