如何在对象上定义可外部调用的函数并用于初始化属性?解决调用报错
解决构造函数中提前调用实例方法的问题
你说得没错,原代码报错的核心原因是执行顺序问题:在构造函数里,你先尝试调用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
相关产品推荐
相关产品推荐

