我有以下构造函数:
function Person(name, age) {
this.name = name;
this.age = age;
}
现在,如果我说:
var p = new Person("jon", 25);
它将创建Person
的实例,但如果用户执行以下操作会怎样:
var p = Person("jon", 25);
这将导致在name
对象上定义age
和window
。
我的问题是,有没有办法阻止用户在没有Person
的情况下直接调用new
,从而不允许window
对象被扩充?
答案 0 :(得分:3)
以下是使用范围安全构造函数的方法:
function Person(name, age) {
if (this instanceof Person) {
this.name = name;
this.age = age;
}
else {
return new Person(name ,age);
}
}
答案 1 :(得分:2)
您可以明确测试条件:
function Person(name, age) {
if (!this || this === window)
return new Person(name, age);
this.name = name;
this.age = age;
}
现在,这仍然不能防止某人做类似
的事情var obj = {};
Person.call(obj, "John", 22);
您可以使用instanceof
进行测试,如另一个答案中所述,该答案处理该问题:
function Person(name, age) {
if (!(this instanceof Person))
return new Person(name, age);
this.name = name;
this.age = age;
}
答案 2 :(得分:1)
请参阅Can I construct a JavaScript object without using the new keyword?
这并不会阻止在没有new
的情况下调用该函数,但使用或不使用new
调用该函数会产生相同的效果。
如果您希望该函数只能构造(即"可调用" new
),您必须查看ES6并声明一个类:
class Person {
constructor() {
// ...
}
}
使用class
调用从new
语法创建的构造函数。否则会抛出错误。
答案 3 :(得分:0)
function Person(name ,age){
if ( ! (this instanceof Person) ) {
return new Person(name, age);
}
this.name = name;
this.age = age;
}