通过这个数据流中移动的平均值来解释实例、构造函数和原型继承的关系(面向对象的思想),给定一个整数数据流和一个窗口大小,根据该滑动窗口的大小,计算滑动窗口里所有数字的平均值。
/**
* Initialize your data structure here.
* @param {number} size
*/
var MovingAverage = function (size) {
this.size = size;
this.queue = [];
this.sum = 0;
};
/**
* @param {number} val
* @return {number}
*/
MovingAverage.prototype.next = function (val) {
this.queue.push(val);
this.sum += val;
if (this.queue.length > this.size) {
const removed = this.queue.shift();
this.sum -= removed;
}
return this.sum / this.queue.length;
};
/**
* Your MovingAverage object will be instantiated and called as such:
* var obj = new MovingAverage(size)
* var param_1 = obj.next(val)
*/
类的构造函数的主要作用就是 定义成员变量并初始化,var MovingAverage = function(size) { ... }
就是是一个 构造函数
构造函数的作用
-
定义成员变量:
this.size
:存储滑动窗口的大小(比如size = 3
表示计算最近 3 个数的平均值)。this.queue
:用数组模拟队列,存储当前窗口中的数字(按添加顺序)。this.sum
:动态维护当前窗口中所有数字的总和(优化计算,避免每次遍历求和)。
-
初始化:
- 当调用
new MovingAverage(3)
时,构造函数会创建一个对象,并初始化:{ size: 3, // 窗口大小固定为 3 queue: [], // 初始窗口为空 sum: 0 // 初始总和为 0 }
- 当调用
实例、构造函数和原型继承的关系?
实例自身属性是构造函数构造的,方法是通过原型链从原型继承的,也可以被其他实例共享
特性 | 自身属性(如 size ) | 共享方法(如 next ) |
---|---|---|
存储位置 | 实例自身 | 构造函数的 prototype |
是否共享 | 不共享(每个实例独立) | 共享(所有实例共用) |
用途 | 存储数据状态 | 定义共享行为逻辑 |
在 JavaScript 中,实例的自身属性(如 size
、queue
、sum
)并不是来源于继承,而是直接由构造函数在实例化时赋予的。
当调用 new MovingAverage(3)
时:
- 创建一个新对象
movingAvg
。 - 执行构造函数,将
size
、queue
、sum
直接赋值到实例自身。 - 实例的
__proto__
指向MovingAverage.prototype
,从而继承next
方法。
为什么这样设计?
- 自身属性:每个实例可能需要不同的初始值(如
size
),直接绑定到实例更高效。 - 继承方法:方法通常是共享的,放在
prototype
上可节省内存(避免每个实例重复创建相同函数)。
类比现实世界
- 自身属性:
比如每个人的 名字、年龄 是自身属性(各不相同)。 - 共享方法:
比如 说话、走路 是人类的共享能力(所有人共用同一套行为逻辑)。
想知道创建的实例对象是由哪个构造函数创建,可以使用实例对象的constructor
属性(不安全) :
作用:标识实例对象的构造函数是哪个
function Car() {}
const myCar = new Car();
console.log(myCar.constructor === Car); // true
生产环境建议使用instanceof,instanceof
也可以用来判断对象的构造函数:
特性 | constructor | instanceof |
---|---|---|
检查方式 | 直接访问属性 | 检查整个原型链 |
可靠性 | 低(易被修改) | 高(原型链不可篡改) |
示例 | obj.constructor === Array | obj instanceof Array |
成员变量和属性的区别?
术语 | 范围 | 典型场景 |
---|---|---|
成员变量 | 对象实例的数据存储 | this.xxx = value |
属性 | 包含数据和方法 | 包含成员变量、getter/setter等 |