es6 Class 的 new.target 属性
2018-02-02 22:16
323 查看
Class 的 new.target 属性
new是从构造函数生成实例对象的命令。ES6
为
new命令引入了一个
new.target属性,该属性一般用在构造函数之中,返回
new命令作用于的那个构造函数。如果构造函数不是通过
new命令调用的,
new.target会返回
undefined,因此这个属性可以用来确定构造函数是怎么调用的。
function Person(name) {
if (new.target !== undefined) {
this.name = name;
} else {
throw new Error('必须使用 new 命令生成实例');
}
}
// 另一种写法
function Person(name) {
if (new.target === Person) {
this.name = name;
} else {
throw new Error('必须使用 new 命令生成实例');
}
}
var person = new Person('张三'); // 正确
var notAPerson = Person.call(person, '张三'); // 报错
上面代码确保构造函数只能通过
new命令调用。
Class 内部调用
new.target,返回当前 Class。
class Rectangle {
constructor(length, width) {
console.log(new.target === Rectangle);
this.length = length;
this.width = width;
}
}
var obj = new Rectangle(3, 4); // 输出 true
需要注意的是,子类继承父类时,
new.target会返回子类。
class Rectangle {
constructor(length, width) {
console.log(new.target === Rectangle);
// ...
}
}
class Square extends Rectangle {
constructor(length) {
super(length, length);
}
}
var obj = new Square(3); // 输出 false
上面代码中,
new.target会返回子类。
利用这个特点,可以写出不能独立使用、必须继承后才能使用的类。
class Shape {
constructor() {
if (new.target === Shape) {
throw new Error('本类不能实例化');
}
}
}
class Rectangle extends Shape {
constructor(length, width) {
super();
// ...
}
}
var x = new Shape(); // 报错
var y = new Rectangle(3, 4); // 正确
上面代码中,
Shape类不能被实例化,只能用于继承。
注意,在函数外部,使用
new.target会报错。
相关文章推荐
- [js高手之路] es6系列教程 - new.target属性与es5改造es6的类语法
- [javascript高手之路] es6系列教程 - new.target属性与es5改造es6的类语法
- js es6系列教程 - 基于new.target属性与es5改造es6的类语法
- spring->aop中proxy-target-class属性的含义以及动态代理机制
- Python tricks(7) -- new-style class的__slots__属性
- es6 javascript的class的静态方法、属性和实例属性
- ES6 javascript中class静态方法、属性与实例属性用法示例
- 创建Bean的三种方式 在大多数情况下,Spring容器直接通过new关键字调用构造器来创建Bean实例,而class属性指定Bean实例的实现类,但这不是实例化Bean的唯一方法。实际上,Sprin
- ES6中class原理,static属性方法,__proto__与prototype深入分析
- ES6 类(Class)基本用法和静态属性方法详解
- ES6 Class 定义私有属性或私有方法
- es6 Class 的私有属性
- Es6 类的关键 super、static、constructor、new.target
- ES6 类(Class)基本用法和静态属性+方法详解
- es6 Class 的 name 属性
- 在【ES6】的【Class】中编写属性的取值函数【get】和存值函数【set】时的三点注意事项
- es6 Class 的静态属性和实例属性
- es6 javascript的class的静态方法、属性和实例属性
- 从零开始学_JavaScript_系列(63)——class(4)静态方法和new.target
- ES6学习——类语法:super和new.target