希望能详细解释下,最好举个例子~
在解释实例化之前,我们要理解一个概念,什么叫做类。
类是抽象概念,比如美食,美食是一个抽象概念,我们不知道什么是美食,每个人对美食的定义不同,有些人认为鲍鱼、龙虾是美食,有些人认为一碗酸汤面就是美食。那么美食,就是类,而鲍鱼、龙虾、酸汤面,就是美食实例化之后的答案。
我们在代码中看一下上述过程:
class Food {
constructor(name) {
this.name = name;
}
print() {
console.log(`美食是: ${this.name}`);
}
}
const abalone = new Food('鲍鱼');
abalone.print(); // 美食是: 鲍鱼
上面的过程,就是实例化过程,而 abalone 就是实例化对象。首先我们声明了一个抽象概念,美食类,在美食类的 constructor(构造器,初始化的时候执行)里,我们需要一个字符串来存储美食的名字。
当我们执行 new Food('鲍鱼') 的时候,就把抽象的类进行了“实例化”变成了一个我们认知体系中存在的鲍鱼,这就是实例化。
JavaScript中,如何才能实例化一个对象?
实例化一个对象,却不用new,为何?在看老外写的源代码时,经常发现他们实例化对象不用new关键字。var date = Date(2016, 3, 20);
上面这句就是一个经典的例子。然后我做了以下的测试date instanceof Date; // false
Object.prototype.toString.call(date); // [object String] 并非Date类型
这个到底是怎么回事?
不是Date一个对象的问题,是js语言的特性。js的对象构造器,实际上是一个函数。用new方式,会创建对象的一个新实例。如果不用new,相当于直接调用函数。构造函数内如果有对this的引用,不会指向新实例本身(也不存在这个新实例),而是会指向调用构造函数时的上下文环境。