Javascript为什么实例化不是声明类的instanceof?

Javascript为什么实例化不是声明类的instanceof?,javascript,Javascript,我创建了一个person类。当我将它实例化为daffyDuck实例时,它不会被识别为A_person的实例。为什么不呢 var A_person = function(firstAndLast) { var splitName = firstAndLast.split(" "); return { getFullName: function(){ return splitName.join(" "); } }; }; var daffyDuck = n

我创建了一个person类。当我将它实例化为
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!)

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

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

有关更多信息,请参见此处

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

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

有关更多信息,请参见此处

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

您需要实际定义类。从ES6开始,这非常简单-():


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

您需要实际定义类。从ES6开始,这非常简单-():


您可以删除
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

您可以删除
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

您正在从
构造函数
返回一个
不同的对象
,它肯定不是
个人的
实例。这就是我能想到的。尝试返回
并检查它。您正在从
构造函数
返回一个
不同的对象
,它肯定不是一个人的
实例。这就是我能想到的。尝试返回
并检查它。当您打算部署到客户端时,请注意使用此方法,因为此标准刚刚在6月份获得批准。许多计算机,主要是在商业世界,将有未更新的软件,将无法运行此代码。无论如何,这可能只是一个学习项目(或学校),所以我不认为这是一个问题。@Arhowk super-true。如果OP想要使用此方法,您应该确保可以传输到ES5。当您打算部署到客户端时,使用此方法时请注意,因为此标准刚刚在6月份获得批准。许多计算机,主要是在商业世界,将有未更新的软件,将无法运行此代码。无论如何,这可能只是一个学习项目(或学校),所以我不认为这是一个问题。@Arhowk super-true。如果OP想使用这种方法,您应该确保Transbile to ES5.w3是一种糟糕的资源。使用这个:“所有JavaScript对象都从它们的原型继承它们的属性和方法。”-除了Object.prototype。可接受的简化。后来半更正了几句。
所有JavaScript对象(日期、数组、RegExp、函数等)都继承自Object.prototype-对象除外。创建(空)
。因为
Object.create
是ES6,“构造函数是您的person对象的原型。”-明显错误。函数的
prototype
属性就是要使用的属性。“有时你想向…”添加新属性(或方法)-糟糕的想法,三倍。猴子补丁在Ruby中是可以接受的,但即使这样,也有更好的解决方案。在Javascript中,猴子补丁的风险太大了。动态地改变一个类的行为违背了OOP的原则。W3学校是一个可怕的资源。使用这个:“所有JavaScript对象都从它们的原型继承它们的属性和方法。”-除了Object.prototype。可接受的简化。后来半更正了几句。
所有JavaScript对象(日期、数组、RegExp、函数等)都继承自Object.prototype-对象除外。创建(空)
。因为
Object.create
是ES6,“构造函数是您的person对象的原型。”-明显错误。函数的
prototype
属性就是要使用的属性。“有时你想向…”添加新属性(或方法)-糟糕的想法,三倍。猴子补丁在Ruby中是可以接受的,但即使这样,也有更好的解决方案。在Javascript中,猴子补丁的风险太大了。动态更改类行为违反了OOP的原则。