我对ES6类有很多疑问。
使用class
语法有什么好处?我读到public / private / static将成为ES7的一部分,这是原因吗?
而且,是class
另一种OOP还是JavaScript的原型继承?我可以使用修改它.prototype
吗?还是只是同一对象,而是两种不同的声明方法。
有速度好处吗?如果您拥有大型应用程序(例如大型应用程序),可能更容易维护/理解?
新的class
语法是,对于现在,大多是语法sugar。(但是,您知道,这是很好的sugar。)ES2015-ES2019中class
没有什么可以构造函数无法做到的,并且Reflect.construct
(包括子类Error
和Array
¹)也无法做到。(有
是
有可能在ES2021一些东西,你可以做class
,你不能这样做,否则:私人领域,私有方法和静态字段/私有静态方法。)
而且,是
class
另一种OOP还是JavaScript的原型继承?
这与我们一直拥有的原型继承相同,只是如果您喜欢使用构造函数(newFoo
等等),则使用更简洁,更方便的语法。(特别是在源自Array
或的情况下Error
,这是您在ES5和更早版本中无法实现的。您现在可以使用Reflect.construct
[
spec,MDN],但不能使用旧的ES5样式。)
我可以使用修改它
.prototype
吗?
是的,prototype
创建类后,仍然可以在类的构造函数上修改对象。例如,这是完全合法的:
class Foo {
constructor(name) {
this.name = name;
}
test1() {
console.log("test1: name = " + this.name);
}
}
Foo.prototype.test2 = function() {
console.log("test2: name = " + this.name);
};
有速度好处吗?
通过提供这种特定的成语,我想这是可能的发动机也许能做得更好优化。但是他们已经非常擅长优化,我希望不会有太大的区别。
ES2015(ES6)
class
语法有什么好处?
简要地说:如果您一开始不使用构造函数,那么首选Object.create
或类似的构造函数class
对您没有用。
如果确实使用构造函数,则有一些好处class
:
语法更简单,更不易出错。
这是 很多 容易(再次,不易出错)使用新的语法比旧的设置继承层次。
class
保护您免受无法new
与构造函数一起使用的常见错误(如果this
不是有效的构造函数,则使构造函数抛出异常)。
使用新语法调用父原型方法的版本比使用旧语法(super.method()
而不是ParentConstructor.prototype.method.call(this)
or Object.getPrototypeOf(Object.getPrototypeOf(this)).method.call(this)
)要简单得多。
这是层次结构的语法比较:
// ***ES2015+**
class Person {
constructor(first, last) {
this.first = first;
this.last = last;
}
personMethod() {
// ...
}
}
class Employee extends Person {
constructor(first, last, position) {
super(first, last);
this.position = position;
}
employeeMethod() {
// ...
}
}
class Manager extends Employee {
constructor(first, last, position, department) {
super(first, last, position);
this.department = department;
}
personMethod() {
const result = super.personMethod();
// ...use `result` for something...
return result;
}
managerMethod() {
// ...
}
}
例:
// ***ES2015+**
class Person {
constructor(first, last) {
this.first = first;
this.last = last;
}
personMethod() {
return `Result from personMethod: this.first = ${this.first}, this.last = ${this.last}`;
}
}
class Employee extends Person {
constructor(first, last, position) {
super(first, last);
this.position = position;
}
personMethod() {
const result = super.personMethod();
return result + `, this.position = ${this.position}`;
}
employeeMethod() {
// ...
}
}
class Manager extends Employee {
constructor(first, last, position, department) {
super(first, last, position);
this.department = department;
}
personMethod() {
const result = super.personMethod();
return result + `, this.department = ${this.department}`;
}
managerMethod() {
// ...
}
}
const m = new Manager("Joe", "Bloggs", "Special Projects Manager", "Covert Ops");
console.log(m.personMethod());
与
// **ES5**
var Person = function(first, last) {
if (!(this instanceof Person)) {
throw new Error("Person is a constructor function, use new with it");
}
this.first = first;
this.last = last;
};
Person.prototype.personMethod = function() {
// ...
};
var Employee = function(first, last, position) {
if (!(this instanceof Employee)) {
throw new Error("Employee is a constructor function, use new with it");
}
Person.call(this, first, last);
this.position = position;
};
Employee.prototype = Object.create(Person.prototype);
Employee.prototype.constructor = Employee;
Employee.prototype.employeeMethod = function() {
// ...
};
var Manager = function(first, last, position, department) {
if (!(this instanceof Manager)) {
throw new Error("Manager is a constructor function, use new with it");
}
Employee.call(this, first, last, position);
this.department = department;
};
Manager.prototype = Object.create(Employee.prototype);
Manager.prototype.constructor = Manager;
Manager.prototype.personMethod = function() {
var result = Employee.prototype.personMethod.call(this);
// ...use `result` for something...
return result;
};
Manager.prototype.managerMethod = function() {
// ...
};
现场示例:
// **ES5**
var Person = function(first, last) {
if (!(this instanceof Person)) {
throw new Error("Person is a constructor function, use new with it");
}
this.first = first;
this.last = last;
};
Person.prototype.personMethod = function() {
return "Result from personMethod: this.first = " + this.first + ", this.last = " + this.last;
};
var Employee = function(first, last, position) {
if (!(this instanceof Employee)) {
throw new Error("Employee is a constructor function, use new with it");
}
Person.call(this, first, last);
this.position = position;
};
Employee.prototype = Object.create(Person.prototype);
Employee.prototype.constructor = Employee;
Employee.prototype.personMethod = function() {
var result = Person.prototype.personMethod.call(this);
return result + ", this.position = " + this.position;
};
Employee.prototype.employeeMethod = function() {
// ...
};
var Manager = function(first, last, position, department) {
if (!(this instanceof Manager)) {
throw new Error("Manager is a constructor function, use new with it");
}
Employee.call(this, first, last, position);
this.department = department;
};
Manager.prototype = Object.create(Employee.prototype);
Manager.prototype.constructor = Manager;
Manager.prototype.personMethod = function() {
var result = Employee.prototype.personMethod.call(this);
return result + ", this.department = " + this.department;
};
Manager.prototype.managerMethod = function() {
// ...
};
var m = new Manager("Joe", "Bloggs", "Special Projects Manager", "Covert Ops");
console.log(m.personMethod());
如您所见,那里有很多重复和冗长的内容,很容易出错,而且很无聊(这就是为什么我回想起今天写一个脚本来这样做的原因)的原因。
¹“
ES2015-ES2018中没有什么class
可以做的,而构造函数不能做到,并且Reflect.construct
(包括子类Error
和Array
)”
例:
// Creating an Error subclass:
function MyError(...args) {
return Reflect.construct(Error, args, this.constructor);
}
MyError.prototype = Object.create(Error.prototype);
MyError.prototype.constructor = MyError;
MyError.prototype.myMethod = function() {
console.log(this.message);
};
// Example use:
function outer() {
function inner() {
const e = new MyError("foo");
console.log("Callng e.myMethod():");
e.myMethod();
console.log(`e instanceof MyError? ${e instanceof MyError}`);
console.log(`e instanceof Error? ${e instanceof Error}`);
throw e;
}
inner();
}
outer();
.as-console-wrapper {
max-height: 100% !important;
}
我对ES2015中的扩展语法和rest参数感到困惑。谁能用恰当的例子解释它们之间的区别?
Jest can be used to mock ES6 classes that are imported into files you want to test. ES6 classes are constructor functions with some syntactic sugar. Therefore, any mock for an ES6 class must be a func
本文向大家介绍详解es6超好用的语法糖Decorator,包括了详解es6超好用的语法糖Decorator的使用技巧和注意事项,需要的朋友参考一下 Decorator(修饰器/装饰器)是es6提出的语法糖,用于修改类的行为。不过目前主流浏览器都没有很好的支持,我们需要用babel来转换为浏览器能识别的语言。在这篇文章中将介绍decorator的基础用法和一些应用实例。 1.修饰类 (1) 基础用法
问题内容: 我是Java开发人员,我想知道如何在Java程序中使用Scala? 问题答案: 去阅读 Daniel Spiewak 关于Scala 的优秀博客系列。使用Scala,您可以保持: 您所有的Java库 在JVM上运行的所有优势(普遍性,管理工具,性能分析,垃圾回收等) 但是您可以编写Scala代码: 比Java更简洁明了(尤其是使用更多的 功能 样式,例如在collections库中)
问题内容: 我注意到,如果不上课之前写的话,它的工作原理就和一样。我不明白为什么会这样?它应该显示一个错误,当我不声明一个类的,或。但这很好。是什么原因? 问题答案: ,并且是访问修饰符。Public表示可以由任何类,由子类保护,由类本身私有的任何类访问主题,没有修饰符表示“受包保护”,因此可以从同一包中的类访问该主题。 主题是类,方法,成员变量。
主要内容:1.换行符和空格,2.严格模式,3.ES6和Hoisting语法是定义符号排列的一组规则,每种语言规范都有其语法。 语法适用于文档代表源代码的编程语言,也适用于文档描述数据的标记语言。 JavaScript中的程序包括: 文字:文字可以定义为表示源代码中的固定值的符号。 通常,文字用于初始化变量。 在下面的示例中,可以看到文字的使用,其中表示整数文字,而字符串 - 是字符串文字。 变量:变量是由内存地址标识的存储位置。 变量是存储程序值的存储块的名称。 变