【问题标题】:Javascript why is instantiation not instanceof declared class? [duplicate]Javascript为什么实例化不是instanceof声明的类? [复制]
【发布时间】:2016-04-05 21:10:14
【问题描述】:

我创建了一个人类。当我将它实例化为daffyDuck 实例时,它不会被识别为A_person 的实例。为什么不呢?

var A_person = function(firstAndLast) {
  var splitName = firstAndLast.split(" ");
  return {
    getFullName: function(){
      return splitName.join(" ");
    } 
  };
};

var daffyDuck = new A_person('Daffy Duck');
daffyDuck instanceof A_person  // false (I expected this to be true!)

【问题讨论】:

  • 您从您的constructor 返回一个different object,这绝对不是instance of A_person。这是我能想到的。尝试返回 this 并检查一下。

标签: javascript


【解决方案1】:

我认为您打算使用原型而不是 构造函数(返回对象)......像这样

function A_Person(firstAndLast){
    this.splitName = firstAndLast.split(" ");
}
A_Person.prototype.getFullName = function(){
     return splitName.join(" ");
}

欲了解更多信息,请参阅此处https://developer.mozilla.org/en/docs/Web/JavaScript/Inheritance_and_the_prototype_chain

【讨论】:

  • W3schools 是一个糟糕的资源。使用这个:developer.mozilla.org/en/docs/Web/JavaScript/…
  • "所有 JavaScript 对象都从它们的原型继承它们的属性和方法。" - 除了 Object.prototype。可接受的简化。几句后半改正。
  • All JavaScript objects (Date, Array, RegExp, Function, ....) inherit from the Object.prototype. - Object.create(null) 除外。充其量是过时的信息,因为Object.create 是 ES6。
  • "构造函数是你的person对象的原型。" - 公然错误。该函数的prototype 属性是被使用的。
  • “有时您想将新属性(或方法)添加到...” - 糟糕的想法,三倍。 Monkey-patching 在 Ruby 中是可以接受的,但即便如此,也存在更好的解决方案。猴子补丁在 Javascript 中太冒险了。并且动态地改变一个类的行为违反了 OOP 的原则。
【解决方案2】:

您可以删除return 语句并改用this 将函数附加到对象。

var A_person = function(firstAndLast) {
  var splitName = firstAndLast.split(" ");
  this.getFullName = function(){
      return splitName.join(" ");
    } 
};

var daffyDuck = new A_person('Daffy Duck');
daffyDuck instanceof A_person  // true

【讨论】:

    【解决方案3】:

    你根本没有定义一个类。您只是在创建一个方法并将其保存到一个变量中。

    您需要实际定义类。从 ES6 开始,这非常容易 - (learn more here):

    class A_person {
      constructor(firstAndLast) {
        var names = firstAndLast.split(" ");
        this.firstName = names[0];
        this.lastName = names[1];
      }
    }
    
    var daffyDuck = new A_person('Daffy Duck');
    

    【讨论】:

    • 当您打算部署到客户端时,请注意使用此方法,尽管此标准刚刚在 6 月获得批准。许多计算机,主要是在商业世界中,将有未更新的软件,将无法运行此代码。无论如何,这可能只是一个学习项目(或学校),所以我认为这不会成为问题。
    • @Arhowk 超级真实。如果 OP 想要使用这种方法,你应该确保转换为 ES5。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    • 2012-07-15
    相关资源
    最近更新 更多