JavaScript构造函数序言的目的是什么
What is purpose of the javascript constructor prologue?
我经常在许多node.js/javascript源代码中遇到以下构造函数序言。
function MyClass () {
// prologue
if (!(this instanceof MyClass)) {
return new MyClass();
}
// do actual constructor logic
}
你能解释一下这是干什么用的吗?谢谢。
>instanceof
检查对象以查看它是否可能是通过给定的构造函数构造的。该序言用于处理有人调用MyClass
构造函数而不使用new
的情况。这意味着您可以按照预期使用的方式使用MyClass
:
var c = new MyClass();
。或不new
:
var c = MyClass();
在后一种情况下,在对MyClass
的调用中,this
不会被instanceof MyClass
(要么是undefined
[在严格模式下],要么是全局对象[在松散模式下](,所以作者知道调用者没有使用new
,只是让函数通过执行return new MyClass();
而不是正常的构造工作来为他们做new
。
有些人喜欢这样做,所以new
是可选的,其他人认为像这样new
可选是一个坏主意。在严格模式之前的糟糕时期,另一种方法是检测调用方无法使用new
并抛出异常:
// Old pre-strict code
if (!(this instanceof MyClass)) {
throw "MyClass is a constructor, use new";
}
如果不这样做,并且使用的是松散模式,并且将属性分配给this
,则将属性分配给全局对象(全局变量(,这是一个坏主意(tm(。
但是现在我们有严格模式,这是使用它的众多原因之一:
"use strict"; // At the top of the file or `script` block
function MyClass() {
// No need for the check anymore
this.someProperty = someValue;
}
该代码完全不会意外创建全局变量,因为如果有人在没有new
的情况下调用MyClass
,this.someProperty = someValue;
行将抛出(因为this
将被undefined
(。(调用方是否使用严格模式并不重要;我们在定义MyClass
构造函数的代码中使用严格模式就足够了。
当然,有些人仍然倾向于将new
设为可选,在这种情况下,他们仍然需要序言。
为了避免直接调用构造器将一些变量注册到全局变量,这是JavaScript的一个著名缺陷。
function Foo() {
// don't do prologue
this.foo = 'foo';
}
Foo(); // direct call a constructor
console.log(window.foo) // foo, global is polluted.
- 在JavaScript中调用array()作为构造函数时,返回的是什么类型的数组
- Angular promise回调不是在构造函数方法内部触发,而是在对象文本方法中触发
- 在ES2015中定义一个类,构造函数方法是什么以及为什么它是必不可少的
- 模拟“类”时,为什么要在 .prototype 属性中设置方法,而不是在构造函数本身中设置方法
- 为什么方法总是添加到原型中,而不是在构造函数中定义
- 构造函数属性值应该是什么 .a 原型构造函数或对象构造函数本身
- 什么是原型?构造函数或其他对象
- JavaScript构造函数序言的目的是什么
- 导出的目的是什么属性函数在挖空.js库中
- 在Javascript中,函数声明是创建构造函数的唯一方法
- 是什么导致函数“;冻结”;在javascript中
- 这个语法是什么意思?(函数(){//code})()
- 什么是对象构造函数
- ->请问这是什么构造?
- 为什么在原型中声明实例属性而不是在构造函数中声明
- 将方法附加到对象原型中,而不是放在构造函数中
- React - Firebase - GoogleAuthProvider不是一个构造函数
- 声明函数的目的是什么!函数(){code}();
- 为什么把方法放在类的原型上,而不是在构造函数中声明呢?
- 究竟是什么!函数($){..}(window.jQuery)执行