美文网首页
JS 构造函数存在的问题

JS 构造函数存在的问题

作者: Yohann丶blog | 来源:发表于2020-05-28 17:08 被阅读0次
e4b867b91685cb2b19cd6622924f9c839e3a2373.jpg_640w_400h.png

问题

function DuelMonster(name, gender, attack) {
  this.name = name;
  this.gender = gender;
  this.attack = attack;
  this.useSkill = function () {
    console.log("黑魔导");
  };
}

var m1 = new DuelMonster("黑魔术师", "male", 2500);
m1.useSkill(); // 打印黑魔导

var m2 = new DuelMonster("黑魔导少女", "female", 2000);
m2.useSkill(); // 打印黑魔导

console.log(m1.useSkill == m2.useSkill); // 结果为 false

在创建完DuelMonster构造函数后,又创建两个实例化对象m1m2去调用useSkill()方法,然后打印这两个方法是否相等,返回了 false 。由于每个对象都是由 new DuelMonster创建出来的,因此每创建一个对象,函数 useSkill()都会被重新创建一次,这个时候,每个对象都调用了功能完全相同的方法,但是它们分别是独立的。

解决

  • 方法一
function useSkill() {
  console.log("黑魔导");
}

function DuelMonster(name, gender, attack) {
  this.name = name;
  this.gender = gender;
  this.attack = attack;
  this.useSkill = useSkill;
}

var m1 = new DuelMonster("黑魔术师", "male", 2500);
m1.useSkill(); // 打印黑魔导
var m2 = new DuelMonster("黑魔导少女",  "female", 2000);
m2.useSkill(); // 打印黑魔导
console.log(m1.useSkill == m2.useSkill); // 结果为 true

单独把useSkill()方法提出来,再每次调用

  • 方法二
function DuelMonster(name, gender, attack) {
  this.name = name;
  this.gender = gender;
  this.attack = attack;
}

DuelMonster.prototype.useSkill = function () {
  console.log("黑魔导");
};

var m1 = new DuelMonster("黑魔术师", "male", 2500);
m1.useSkill(); // 打印黑魔导
var m2 = new DuelMonster("黑魔导少女",  "female", 2000);
m2.useSkill(); // 打印黑魔导
console.log(m1.useSkill == m2.useSkill); // 结果为 true

使用 JS 中的 prototype (原型),指向另一个对象。这个对象的所有属性和方法,都会被构造函数的实例继承。在这里,useSkill()方法被DuelMonster构造函数所继承。

相关文章

  • JS 构造函数存在的问题

    问题 在创建完DuelMonster构造函数后,又创建两个实例化对象m1和m2去调用useSkill()方法,然后...

  • 我的JS笔记 -- 类

    JS是没有类的,但JS可以利用构造函数实现近似类的功能。 构造函数 构造函数,是用来创建对象的函数。与普通的函数声...

  • 前端JS进阶二(ES6-Class语法)

    Class和普通构造函数有何区别 前端会使用ES6中的Class来代替JS中的构造函数 JS 构造函数 Class...

  • JavaScript创建对象(三)——原型模式

    在《JavaScript创建对象(二)——构造函数模式》中提到,构造函数模式存在相同功能的函数定义多次的问题。本篇...

  • 2020-12-15

    js对象的创建和函数 创建对象 工厂模式 构造函数 原型方式+构造函数

  • 04_JS面向对象

    知识点 传统构造函数存在的问题 使用原型解决构造函数问题 原型相关的概念 原型的使用 使用原型的注意事项 __pr...

  • 2021-04-15

    Js构造函数、原型、原型链整理 1,普通函数、构造函数区别: 1,名字: 构造函数首字母建议大写,普通函数首字母建...

  • js原型prototype原型链__proto__以及必会的ne

    什么是构造函数 构造函数是典型的面向对象编程语言,js的对象语言体系,是基于构造函数和原型链的构造函数是生成对象实...

  • js构造函数this指向

    JS里没有类. 构造函数是个函数,this指向的是个对象,this蒙上眼睛指也指不到构造函数去. 构造函数的thi...

  • 深入理解javascript原型和原型链

    构造函数 通过 new 函数名 来实例化对象的函数叫构造函数。任何的函数都可以作为构造函数存在。之所以有构造函数...

网友评论

      本文标题:JS 构造函数存在的问题

      本文链接:https://www.haomeiwen.com/subject/vypaahtx.html