【问题标题】:JavaScript Object and methods but getName is not a functionJavaScript 对象和方法,但 getName 不是函数
【发布时间】:2016-10-10 22:23:14
【问题描述】:

我正在学习 JavaScript 并编写一个简单的演示,但失败了。你能帮我弄清楚为什么getName 不是一个函数吗?谢谢。

var newPerson = function(name) {
  this.name = name;
  getName: return function() {
    return this.name;
  }  
};  
			
var personOne = newPerson("Diego");  
var personTwo = newPerson("Gangelo");  
console.log(personOne.getName()); // prints Diego  
console.log(personTwo.getName()); // prints Gangelo

【问题讨论】:

  • 你能运行它吗?有没有发现什么错误?

标签: javascript oop object member-functions


【解决方案1】:

看起来您正试图返回一个带有一些公开方法的对象。在那种情况下,这就是我会做的。

var newPerson = function (name) {
    this.name = name;
    var self = this; 

    return {
        getName: function () {
            return self.name
        }
    }
}

var personOne = new newPerson("Diego");  
var personTwo = new newPerson("Gangelo");  
console.log(personOne.getName()); // prints Diego  
console.log(personTwo.getName()); // prints Gangelo

编辑:感谢 Pootie

或者你也可以这样做。

    var newPerson = function (name) {
        this.name = name;
        
        this.getName = function () {
            return this.name;
        }
    }

    var personOne = new newPerson("Diego");  
    var personTwo = new newPerson("Gangelo");  
    console.log(personOne.getName()); // prints Diego  
    console.log(personTwo.getName()); // prints Gangelo

下次使用 console.log() 代替 document.write(),因为这样更容易调试。

【讨论】:

  • 这是错误的。首先,您的方法是静态的,每次调用 newPerson 时您只是覆盖“this.name”。您需要调用new 使其成为“类”,并且在返回名称时需要引用“this”,否则您只是返回您传递给函数的任何内容。见:jsfiddle.net/v0bko3ug/1
  • 好的,编辑后看起来更好,但您仍然会返回第一个示例中出现的任何“名称”,而不是对象的属性
  • @PootieTang 你能解释一下吗?为什么我做错了什么?
  • @pzp 嗯,我先这样做了,但未定义。我想我会使用 Pooties jsfiddle 示例
  • 如果您从第一个示例中删除 this.name = name; 它仍然有效,因为您没有返回对象的名称属性。它仍然返回名称的原因是因为您传递的名称变量仍在 getName 函数的范围内。
【解决方案2】:

我会这样做

var Person = function(name) {
    this.name = name;
    this.getName = function() {
        return this.name;
    }
};
var personOne = new Person("Diego");
var personTwo = new Person("Gangelo");
document.write(personOne.getName()); // prints Diego  
document.write(personTwo.getName()); // prints Gangelo

【讨论】:

    【解决方案3】:

    既然你说你喜欢我的例子,我想我会发布我的个人偏好。无需像其他示例那样返回对象,因为函数本身就是一个对象。事实上,JS 中的一切都是对象。

    查看另一个答案的这个分支:https://jsfiddle.net/6xpgjh94/

    var newPerson = function (name) {
        var self = this;
        self.name = name;
        self.getName = function(){
            return self.name
        };
    }
    
    var personOne = new newPerson("Diego");  
    var personTwo = new newPerson("Gangelo");  
    console.log(personOne.getName()); // prints Diego  
    console.log(personTwo.getName()); // prints Gangelo
    

    【讨论】:

      【解决方案4】:

      好吧,如果我们是 introducing Object-Oriented Programming,我不妨向您展示 JavaScript 是如何做到最好的:

      // The ECMAScript 5 way
      
      function Person(name) {
        this.name = name;
      }
      
      Person.prototype.getName = function getName() {
        return this.name;
      };
      
      var personOne = new Person("Diego");
      var personTwo = new Person("Gangelo");
      
      console.log(personOne.getName());
      console.log(personTwo.getName());

      下一个使用 ES6 Classes 并且是新 JavaScript 标准的一部分。

      注意就浏览器实现而言,此语法仍处于“实验阶段”,可能不适用于您的浏览器。

      // The ECMAScript 6 way
      
      class Person {
        constructor(name) {
          this.name = name;
        }
        getName() {
          return this.name;
        }
      }
      
      let personOne = new Person("Diego");
      let personTwo = new Person("Gangelo");
      
      console.log(personOne.getName());
      console.log(personTwo.getName());

      【讨论】:

      • let 不是 var 的 js6 替代品,它们做的事情完全不同。没有理由在这里使用 let。
      • @PootieTang 我知道他们的差异,并且本着给出完整 ES6 答案的精神,我选择放弃他们的差异以展示重要的部分。事实上,没有理由在这里使用它们。
      • 没有理由不这样做不是理由。但是有一个理由不... 除非有明确的理由 使用它,否则永远不应该使用它。但这就是你不应该使用它的原因。 jsfiddle.net/xnujfzf1 ...不要添加无关代码只是,因为它是js6..
      • @PootieTang let 存在的全部原因是人们一开始就不会试图宣传这种有缺陷的范围设计,但我来这里并不是为了进行一场关于与原始问题无关的简单结构,因此除非您有与问题相关的内容可以贡献,否则请停止抱怨我完全有效的答案。
      • @PootieTang 我不妨指出您的演示不起作用,甚至不是您想要的原因。首先是错误的else 关键字,并且即使执行了else 部分,您运行console.log(personOne.getName()) 也是一个逻辑错误,与letvar 之间的选择完全无关。 Here 是一个更有说服力的论据,说明为什么 letvar 好得多。检查控制台,看看自己有什么问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多