JavaScript中实例、构造函数和原型继承的关系

通过这个数据流中移动的平均值来解释实例、构造函数和原型继承的关系(面向对象的思想),给定一个整数数据流和一个窗口大小,根据该滑动窗口的大小,计算滑动窗口里所有数字的平均值。 

/**
 * 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) { ... } 就是是一个 ​​构造函数

构造函数的作用

  1. ​定义成员变量​​:

    • this.size:存储滑动窗口的大小(比如 size = 3 表示计算最近 3 个数的平均值)。
    • this.queue:用数组模拟队列,存储当前窗口中的数字(按添加顺序)。
    • this.sum:动态维护当前窗口中所有数字的总和(优化计算,避免每次遍历求和)。
  2. ​初始化​​:

    • 当调用 new MovingAverage(3) 时,构造函数会创建一个对象,并初始化:
      {
        size: 3,    // 窗口大小固定为 3
        queue: [],  // 初始窗口为空
        sum: 0      // 初始总和为 0
      }

实例、构造函数和原型继承的关系?

 实例自身属性是构造函数构造的,方法是通过原型链从原型继承的,也可以被其他实例共享 

特性自身属性(如 size共享方法(如 next
​存储位置​实例自身构造函数的 prototype
​是否共享​不共享(每个实例独立)共享(所有实例共用)
​用途​存储数据状态定义共享行为逻辑

在 JavaScript 中,​​实例的自身属性(如 sizequeuesum)并不是来源于继承,而是直接由构造函数在实例化时赋予的​​。

当调用 new MovingAverage(3) 时:

  1. 创建一个新对象 movingAvg
  2. 执行构造函数,将 sizequeuesum ​​直接赋值到实例自身​​。
  3. 实例的 __proto__ 指向 MovingAverage.prototype,从而继承 next 方法。

为什么这样设计?

  • ​自身属性​​:每个实例可能需要不同的初始值(如 size),直接绑定到实例更高效。
  • ​继承方法​​:方法通常是共享的,放在 prototype 上可节省内存(避免每个实例重复创建相同函数)。

类比现实世界​

  • ​自身属性​​:
    比如每个人的 ​​名字、年龄​​ 是自身属性(各不相同)。
  • ​共享方法​​:
    比如 ​​说话、走路​​ 是人类的共享能力(所有人共用同一套行为逻辑)。

想知道创建的实例对象是由哪个构造函数创建,可以使用实例对象的​constructor 属性​(不安全) :

作用:标识实例对象的构造函数是哪个
function Car() {}
const myCar = new Car();
console.log(myCar.constructor === Car); // true

 生产环境建议使用instanceof,instanceof 也可以用来判断对象的构造函数:

特性constructorinstanceof
​检查方式​直接访问属性检查整个原型链
​可靠性​低(易被修改)高(原型链不可篡改)
​示例​obj.constructor === Arrayobj instanceof Array

成员变量和属性的区别?

术语范围典型场景
成员变量对象实例的数据存储this.xxx = value
属性包含数据和方法包含成员变量、getter/setter等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值