ECMAScript 2015规范提到关键字(或单词?)new.target正好3次 - 在14.2.3中 1次:
通常,Contains不会查看大多数函数表单但是,Contains用于检测ArrowFunction中的new.target,this和super用法.
在14.2.16中两次:
ArrowFunction不为arguments,super,this或new.target定义本地绑定.对ArrowFunction中的参数,super,this或new.target的任何引用 都必须解析为词汇封闭环境中的绑定
MDN提到它,但非常模糊,页面不完整.
巴别塔似乎不支持它.尝试在函数(箭头或其他)中使用new.target时出现语法错误.
它是什么,它应该如何使用?
这是一个纯粹的理论问题.我从'你不知道js'学习javascript,我被困bind在JS 中的函数实现.考虑以下代码:
function foo(something) {
this.a = something;
}
var obj1 = {};
var bar = foo.bind(obj1);
bar(2);
console.log(obj1.a); // 2
var baz = new bar(3);
console.log(obj1.a); // 2
console.log(baz.a); // 3Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我们绑定foo()到obj1,所以this在foo()属于obj1这就是为什么obj1.a变成2当我们调用bar(2).但是new操作员能够优先使用,obj1.a即使bar(3)被调用也不会改变new.
以下是MDN页面提供的polyfill bind(..):
if (!Function.prototype.bind) {
Function.prototype.bind = function(oThis) {
if (typeof this !== "function") {
// closest thing possible to …Run Code Online (Sandbox Code Playgroud) 在JS中的构造函数对象中,如果它是在没有new关键字的情况下创建的,则"this"变量是对窗口而不是对象的引用.尝试检测这个是一个特别明智的想法吗?
function MyObject ()
{
if (this === window) {
alert('[ERROR] Oopsy! You seem to have forgotten to use the "new" keyword.');
return;
}
// Continue with the constructor...
}
// Call the constructor without the new keyword
obj = MyObject()
Run Code Online (Sandbox Code Playgroud) 我想创建一个构造函数来创建一个documentElement对象.
作为一个例子,考虑新的Audio()构造函数 - 它创建一个documentElement对象,如果你传递一些变量,它会用属性填充新的documentElement.它不会将它插入DOM,它只是创建对象.
所以,问题是 - 是什么让documentElement与一个vanilla javascript对象({property:value}类型)不同,你能为对象编写构造函数吗?
编辑:
我正在使用的是在没有它的浏览器中重新创建新的Audio()构造函数,使用quicktime或flash HTMLObjectElement代替HTMLAudioElement.
我可以认为audio.constructor将引用HTMLObjectElement,因为在支持它的浏览器中使用新的Audio(),audio.constructor引用HTMLAudioElement.
我不确定Audio.prototype.当我在具有音频支持的浏览器中查询console.log(Audio.prototype)时,它们根本不返回任何内容 - 甚至在console.log中都没有空行 - 所以这让我感到难过.但是,如果我理解正确,它不会影响我的目标.
目的是能够使用Audio构造函数进行编码,并让浏览器本地处理它,或者在需要时设置插件实例.
可能重复:
如何检测函数是否被调用为构造函数?
我希望在JavaScript中有一个函数,如果它被正常调用或者为了创建一个新实例而调用它,它的行为会有所不同.可能存在许多不同的用途,其中两个功能可以相关或不相关.new当函数总是用于创建新实例时,一种用途是免除编码器必须键入:
function MyClass(arg1, arg2) {
if(/* not called with "new" */) return new MyClass(arg1, arg2);
// instance initialization stuff here...
}
Run Code Online (Sandbox Code Playgroud)
这样我就不必输入var x = new MyClass(arg1, arg2):输入就足够了var x = MyClass(arg1, arg2)(但前者也不会错).
只是可能使用的一个例子.
可以这样做吗?如果是这样,怎么样?