如何强制执行JavaScript构造函数
How to enforce a JavaScript constructor?
我有以下构造函数:
function Person(name, age) {
this.name = name;
this.age = age;
}
现在如果我说:
var p = new Person("jon", 25);
它将创建一个Person
的实例,但如果用户执行以下操作会怎样:
var p = Person("jon", 25);
这将导致在window
对象上定义name
和age
。
我的问题是,有没有一种方法可以防止用户在没有new
的情况下直接调用Person
,从而不允许对window
对象进行增强?
这里有一种使用范围安全构造函数的方法:
function Person(name, age) {
if (this instanceof Person) {
this.name = name;
this.age = age;
}
else {
return new Person(name ,age);
}
}
阅读更多:OO JavaScript 中的新/Scope安全构造函数
您可以显式测试条件:
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;
}
请参阅是否可以在不使用new关键字的情况下构造JavaScript对象?
这并不能阻止在没有new
的情况下调用该函数,但使用或不使用new
调用该函数都会产生相同的效果。
如果您希望函数只可构造(即new
"可调用"),则必须查看ES6并声明一个类:
class Person {
constructor() {
// ...
}
}
根据class
语法创建的构造函数必须使用new
进行调用。否则将引发错误。
function Person(name ,age){
if ( ! (this instanceof Person) ) {
return new Person(name, age);
}
this.name = name;
this.age = age;
}
相关文章:
- javascript中对象构造函数中的var属性与this.properties
- 如果在构造函数中有“返回”,则在 JavaScript 中的新运算符中做了什么
- 文本表示法VS.构造函数,用于在JavaScript中创建对象
- Javascript:为什么是构造函数's __proto__属性Empty(){}
- Chrome Javascript日期构造函数错误
- 如果在构造函数内部为else,则Javascript是可选的
- 是否可以测试javascript函数是否是构造函数
- JavaScript模块模式-如何在使用对象/函数之前激发构造函数/init函数
- JavaScript可以'无法通过SharedWorker()构造函数
- Javascript:继承原型而不重新定义构造函数
- Javascript - 如何向对象构造函数添加属性
- 从类构造函数继承javascript
- 创建构造函数的构造函数 (JavaScript)
- 在构造函数 JavaScript 中将属性设置为函数
- 使用不同的构造函数 JavaScript 循环遍历相同类型的对象
- 为构造函数(JavaScript)模拟apply()
- 异步构造函数Javascript
- IE11不能很好地使用Blob构造函数&javascript数组
- 构造函数 - JavaScript
- 如何在函数构造函数 javascript 中访问属性