new.target元属性 | 分别用es5、es6 判断一个函数是否使用new操作符

函数内部有两个方法 [[call]] 和 [[construct]] (箭头函数没有这个方法),当使用new 操作符时, 函数内部调用 [[construct]], 创建一个新实例,this指向这个实例; 不使用new 操作符时, 函数内部调用 [[call]]

判断一个函数是否使用new操作符,ES5的方法:

function Person(name) {
    if (this instanceof Person) {
        this.name = name;
    } else {
        throw new Error("You must use new operator");
    }
}
var p = new Person("James"); // ok
var p = Person("James"); // error
// 但是可以通过其他方式绕过这种错误
var notPerson = Person.call(p, "Nicholas"); // works

ES6 通过new.target 来判断是否使用new,元属性 是指一个提供目标相关额外信息(比如new)的非对象属性。

function Person(name) {
    if (typeof new.target !== "undefined") {
        this.name = name;
    } else {
        throw new Errow("You must use new operator");
    }
}
var p = new Person("James"); // ok
var notPerson = Person.call(p, "Louis"); // error 

 

原文地址:https://www.cnblogs.com/liujinyu/p/8521576.html

时间: 2024-08-30 00:42:58

new.target元属性 | 分别用es5、es6 判断一个函数是否使用new操作符的相关文章

简述ES5 ES6

很久前的某一天,一位大神问我,你知道ES6相对于ES5有什么改进吗? 我一脸懵逼的反问,那个啥,啥是ES5.ES6啊. 不得不承认与大神之间的差距,回来深思了这个问题,结合以前的知识,算是有了点眉目. JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,我们知道javascript的三个基本组成部分是ECMAJavascript(European Computer Manufacturers Association javascript,也就是前面说的ES,但之前你问

【转】「译」ES5, ES6, ES2016, ES.Next: JavaScript 的版本是怎么回事?

ES5, ES6, ES2016, ES.Next: What's going on with JavaScript versioning? Posted by Hux on September 22, 2015 JavaScript 有着很奇怪的命名史. 1995 年,它作为网景浏览器(Netscape Navigator)的一部分首次发布,网景给这个新语言命名为 LiveScript.一年后,为了搭上当时媒体热炒 Java 的顺风车,临时改名为了 JavaScript (当然,Java 和

面向对象JS ES5/ES6 类的书写 继承的实现 new关键字执行 this指向 原型链

一 .什么是面向对象? 面向对象(Object Oriented),简写OO,是一种软件开发方法. 面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物. 面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构.应用平台.分布式系统.网络管理结构.CAD技术.人工智能等领域. 面向对象是相对于面向过程来讲的,面向对象方法,把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统建模,更贴近事物的自然运行模式. 编程范式 一般可以

target事件属性

获取下拉框值 1.此种方法无法在页面获取到下拉框值 <th field="CLTZDYMC" data-options="formatter: function(value,row,index){return row.CLTZDYMC}"editor="{type:'combobox', options:{ valueField:'CLTZDYMC', textField:'CLTZDYMC', url:'common_getCltzdymcJson

target 事件属性

定义和用法 target 事件属性可返回事件的目标节点(触发该事件的节点),如生成事件的元素.文档或窗口. 语法 event.target 实例 下面的例子可获得触发事件的元素: 1 <html> 2 <head> 3 4 <script type="text/javascript"> 5 function getEventTrigger(event) 6 { 7 x=event.target; 8 alert("The id of the

SharePoint 根据列表项目的元属性按照条件筛选列表项目 Web 部件

SharePoint 根据列表项目的元属性按照条件筛选列表项目 Web 部件 效果截图: 将Web部件添加到列表页面上 删选Country栏目为Germany 筛选城市为Berlin 编辑Web部件,可以选择供筛选的栏目 Web部件下载地址:点击此处下载. 后来知道原来是国人写的. 参考下面的博文: http://www.cnblogs.com/jianyi0115/archive/2011/12/09/2282287.html http://www.cnblogs.com/jianyi0115

ES6基础之——函数的名字name属性

1.ES6给函数添加了一个name属性,使用这个属性,我们可以得到这个函数的名字,例子: 如下用函数声明的方式创建了一个函数,然后输出函数的name属性,得到的是函数的名字 function breakfast(argument){ } console.log(breakfast.name) //breakfast 2.使用匿名函数表达式的方法定义的函数,它的name属性值就是变量的名字,例子: 定义一个变量,名字是breakfast,它的值是一个函数,然后输出这个变量的name属性: let

Es5.Es6区别

ES5&&ES6 一.let 1.块级作用域, let定义的变量只在代码块中有效 2.let声明的变量不会提前(前置)(意味着必须先定义后使用) 3.不能重复定义 ,在同一个作用域中不能声明同名的变量 4.暂时性死区(当内部变量与外部变量同名时,内部变量会屏蔽外部变量) 注:let和var的区别 1)let声明的变量是块级作用域(所在一对花括号里),var是函数作用域和全局作用域 注意:let是可以定义全局变量,局部变量,块级作用域的变量.(和写代码的位置有关) 2)let声明的变量不会声

ES6 入门系列 - 函数的扩展

1函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法. function log(x, y) { y = y || 'World'; console.log(x, y); } log('Hello') // Hello World log('Hello', 'China') // Hello China log('Hello', '') // Hello World 上面代码检查函数log的参数y有没有赋值,如果没有,则指定默认值为World.这种写法的