构造函数内的方法 直接写在构造函数内部 与 写在prototype上 的区别

文章目录


前言

以前没注意过, 去创建一个构造函数的时候, 方法都是直接写在函数内的. 在构造函数需要多次实例化的情况下有缺点, 不过幸好以前项目里的构造函数也不需要多次实例化, 缺点没有生效.


区别

为了比较, 先在构造函数内部直接书写方法, 查看实例化结果:

javascript 复制代码
function Person(age, sex) {
  this.age = age;
  this.sex = sex;
  this.getAge = function () {
    console.log(this.age);
    this.age++;
    return this.age;
  }
}

const person0 = new Person(20, 'female');
const person1 = new Person(20, 'female');
console.log(person0);
console.log(person1);

如上图, 直接写在构造函数内, 在对象原型链上是找不到这个方法的, 只有对象内部存在该方法;

尝试调用对象内的属性时会先在对象内部查找, 如果找不到会去对象原型上查找.

如果把方法写在原型上, 实例化多个对象的时候就不会在每个对象内都定义这个方法, 而是实例化出的全部对象共用同一原型内的该方法, 每个对象内就不再存在存储该函数的键值对, 这占据更小的内存:

javascript 复制代码
function Person(age, sex) {
  this.age = age;
  this.sex = sex;
}
Person.prototype.getAge = function () {
  this.age++;
  return this.age;
}

const person0 = new Person(20, 'female');
const person1 = new Person(30, 'female');
console.log(person0);
console.log(person1);

刚才想了一下可不可以把属性也写在原型里, 不太能, 实例化多个对象必然是需要存在各对象内属性不同的情况, 那么属性写进去共用, 某处修改互相影响, 会造成麻烦, 而方法可以公用基本不会动所以可以写在原型里.

如果需要写在构造函数原型里的某方法在某实例内不同, 那就在该实例中新定义重名方法, 因为调用时还是优先在实例内查找的, 找到了就不会再去原型上找, 这并不是函数重载.


总结

--

相关推荐
一方热衷.3 小时前
YOLO26-Seg ONNXruntime C++/python推理
开发语言·c++·python
靓仔建5 小时前
Vue3导入组件出错does not provide an export named ‘user_setting‘ (at index.vue:180:10)
开发语言·前端·typescript
EnoYao5 小时前
我写了一个团队体检报告 Skill,把摸鱼的同事扒出来了😅
前端·javascript
Never_Satisfied5 小时前
在JavaScript / Node.js中,package.json文件中的依赖项自动选择最新版安装
javascript·node.js·json
蓝莓味的口香糖5 小时前
【vue3】组件的批量全局注册
前端·javascript·vue.js
赶路人儿6 小时前
UTC时间和时间戳介绍
java·开发语言
6+h6 小时前
【java】基本数据类型与包装类:拆箱装箱机制
java·开发语言·python
Fighting_p7 小时前
【element UI】el-select 组件下拉数据某一行文字过多时,文字换行展示,避免el-select下拉框被撑宽,导致页面过丑
前端·javascript
夕珩7 小时前
单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式、解释器模式、命令模式
单例模式·解释器模式·建造者模式·工厂方法模式·抽象工厂模式·命令模式·原型模式
未来之窗软件服务7 小时前
幽冥大陆(一百12)js打造json硬件管道——东方仙盟筑基期
开发语言·javascript·算法·json·仙盟创梦ide·东方仙盟·东方仙盟算法