You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在对象上定义可外部调用的函数并用于初始化属性?解决调用报错

解决构造函数中提前调用实例方法的问题

你说得没错,原代码报错的核心原因是执行顺序问题:在构造函数里,你先尝试调用this.getDateString(),但此时这个方法还没被赋值给this(赋值操作在调用之后),所以此时this.getDateString是undefined,自然会抛出“不是函数”的错误。

另外还要提醒你:原代码里的date变量未声明,必须先创建new Date()实例才能调用getFullYear()等方法,不然还会触发另一个date is not defined的错误。

下面给你几个既能保留外部调用能力,又能解决问题的方案:

方案1:调整赋值与调用的顺序

直接把this.getDateString的定义移到调用语句之前,这样调用时方法已经存在了:

const Model = function () {
  // 先给this绑定方法
  this.getDateString = function() {
    let date = new Date(); // 补上缺失的Date实例
    let year = date.getFullYear();
    let month = date.getMonth() + 1;
    let day = date.getDate();
    return `${year}-${month}-${day}`; // 用模板字符串更简洁
  }
  // 再调用方法
  let dateParam = this.getDateString();
}

这样修改后,外部可以正常通过new Model().getDateString()调用该方法,完全符合你的需求。

方案2:使用原型方法(更推荐)

把方法定义在构造函数的原型上,这样不管构造函数内部的执行顺序,实例都能访问到这个方法,而且所有实例会共享同一个方法,节省内存:

const Model = function () {
  let dateParam = this.getDateString();
}

// 在原型上定义方法
Model.prototype.getDateString = function() {
  let date = new Date();
  let year = date.getFullYear();
  let month = date.getMonth() + 1;
  let day = date.getDate();
  return `${year}-${month}-${day}`;
}

外部调用方式不变:const model = new Model(); model.getDateString();

方案3:改用ES6 Class语法(最直观)

如果你的环境支持ES6,用类语法会更清晰,类的方法默认挂载在原型上,构造函数里可以直接调用:

class Model {
  constructor() {
    let dateParam = this.getDateString();
  }

  getDateString() {
    let date = new Date();
    let year = date.getFullYear();
    let month = date.getMonth() + 1;
    let day = date.getDate();
    return `${year}-${month}-${day}`;
  }
}

这种写法完全避免了执行顺序的坑,代码可读性更高,外部调用也和之前一致。

内容的提问来源于stack exchange,提问作者Sahand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:28:16