Notes

JavaScript 原型对象

在 JavaScript 中,创建对象有两种普遍的方式

实际上,上面所说的「模版」,一般在 Java 等语言中,是使用 class 来进行标记。

在 ES6 及以后,也可以使用 class 关键字来进行标记,但其实现的原理并没有变,在 JavaScript 中,「模版」其实就是一个普通的 JavaScript 函数,但由于在 JavaScript 中,函数是一等公民,这就使得函数并不是那么普通了

原型对象结构

这是从 《JavaScript 高级程序设计》中截取的原型对象的图,结合这个图,我们可以来了解当我们创建一个函数时发生了什么事


然后,再了解下关于图中 [[Prototype]] 这个属性


根据上述的理解,我们可以得出下面的结论

其他的一些认识

继承

在 JavaScript 中,实现继承的机制与 Java 等语言不同。Java 等语言实现的继承是复制式的继承,即父类和子类中的数据其实是隔离的。而 JavaScript 中实现的继承是引用式的继承,即所谓的父类和子类中的部分数据是通过引用关系来处理的,少有不慎,就会导致数据的不一致

在 JavaScript 中实现继承的核心在于,通过修改对象的原型对象类来实现一条原型链

以下例子是来自 《JavaScript 高级程序设计》

定义一个父类

通过第一部分可以知道,在 JavaScript 中,所谓的类,其基本也只是一个函数而已

function SuperType() {
  this.property = true;
}

SuperType.prototype.getSuperValue = function () {
  return this.property;
};

定义一个子类

function SubType() {
  this.subProperty = false;
}

SubType.prototype = new SuperType();

SubType.prototype.getSubValue = function () {
  return this.subProperty;
};

最后,再将代码打印出来

function SuperType() {
	this.property = true;
}

SuperType.prototype.getSuperValue = function () {
	return this.property;
}

function SubType() {
	this.subProperty = false;
}

SubType.prototype = new SuperType();

SubType.prototype.getSubValue = function () {
	return this.subProperty;
}

const superInstance = new SuperType();
const subInstance = new SubType();

console.log(superInstance.getSuperValue()); // true
console.log(superInstance.getSubValue()); // TypeError: ...

console.log(subInstance.getSuperValue()); // true
console.log(subInstance.getSubValue()); // false

console.log(SuperType.prototype); // SuperType { getSuperValue: [Function] }
console.log(SubType.prototype); // SuperType { property: true, getSubValue: [Function] }

console.log(superInstance.constructor); // [Function: SuperType]
console.log(subInstance.constructor); // [Function: SuperType]

可以看到,实现继承后