如何强制执行JavaScript构造函数?
我有以下构造函数:如何强制执行JavaScript构造函数?,javascript,Javascript,我有以下构造函数: function Person(name, age) { this.name = name; this.age = age; } function Person(name, age) { if (this instanceof Person) { this.name = name; this.age = age; } else { return new Person(name ,age); } } 现在如果我说: var
function Person(name, age) {
this.name = name;
this.age = age;
}
function Person(name, age) {
if (this instanceof Person) {
this.name = name;
this.age = age;
}
else {
return new Person(name ,age);
}
}
现在如果我说:
var p = new Person("jon", 25);
它将创建Person
的实例,但如果用户执行以下操作,该怎么办:
var p = Person("jon", 25);
这将导致在窗口
对象上定义名称
和年龄
我的问题是,有没有一种方法可以防止用户在没有
new
的情况下直接调用Person
,从而不允许对window
对象进行扩展?您可以显式测试以下条件:
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;
}
下面是一种使用范围安全构造函数的方法:
function Person(name, age) {
this.name = name;
this.age = age;
}
function Person(name, age) {
if (this instanceof Person) {
this.name = name;
this.age = age;
}
else {
return new Person(name ,age);
}
}
阅读更多信息:请参阅
这不会阻止在不使用new
的情况下调用函数,但是在使用或不使用new
的情况下调用函数将具有相同的效果
如果您只希望函数是可构造的(即使用
new
“callable”),则必须查看ES6并声明一个类:
class Person {
constructor() {
// ...
}
}
从
类
语法创建的构造函数必须使用new
调用。否则会抛出错误。这是很酷的东西,活生生的学习:)你不能测试(!(这个人的实例))吗?因此,这可以防止一切发生?@Strandkid使用instanceof
进行测试是最好的做法-我应该编辑答案。这基本上是正确的,但请参阅下面我的测试,以获得更简单的形式
function Person(name ,age){
if ( ! (this instanceof Person) ) {
return new Person(name, age);
}
this.name = name;
this.age = age;
}