在JavaScript中创建对象并添加属性和方法

时间:2015-04-19 09:20:19

标签: javascript object

我刚刚开始在javaScript中研究对象并遇到了一些麻烦。我将逐步解释我试图做的事情,当有一个步骤我没有完全掌握时,我会问我的问题。

我创建了一个名为person的对象。然后我想添加一个名为“firstName”的属性,其值为“Isaac”。为此,我创建了一个构造函数。

var person = new print1("Isaac")

function print1(firstName) {
    this.firstName = firstName;
}

到目前为止没有问题。但是,我想让函数返回“我的名字是”+ person.firstName +“。”但是当我把它放在里面时,我无法做到。

function print1(firstName) {
    this.firstName = firstName;
    return "My name is " + this.firstName + "." 
}

我的想法是我应该能够只调用person.print1()和“我的名字是Isaac”。会出现。

为什么不起作用?或者我甚至不能这样做?

我尝试过与下面这个功能类似的东西,但也不能让它与之相配。当我运行它时,我收到一条错误消息“person.print2()不是函数。

function print2(firstName, lastName, nationality) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.nationality = nationality;
    return "My name is " + this.firstName + " " + this.lastName + " from " + this.nationality + ".";
}
console.log(person.print2());

person = new print2("Isaac", "Newton", "England");

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

根本问题在于您尝试将构造函数方法合并为一件事。它们是你明确定义的不同的东西。

所以你有一个构造函数(约定是他们有一个大写的第一个字母):

function Person(name) {
    this.name = name;
}

...然后你可以通过将它们添加到函数的prototype对象中来为使用该构造函数创建的对象添加一个方法:

Person.prototype.print1 = function() {
    return "My name is " + this.name;
};

致电时

var person = new Person("Isaac");

... new运算符创建一个新对象,并为其提供一个基础原型,它来自Person.prototype属性,然后调用Person函数this引用该新对象,Person中的代码将对象传递的名称存储为name属性。

当您致电print1时,this再次设置为引用该对象,因此this.name为我们提供了名称:

console.log(person.print1()); // "My name is Isaac"

所有这些的实例:

function Person(name) {
  this.name = name;
}

Person.prototype.print1 = function() {
  return "My name is " + this.name;
};

var person = new Person("Isaac");

snippet.log(person.print1()); // "My name is Isaac"
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

你没有拥有来定义Person.prototype对象的方法,你也可以在构造函数中定义它们,如下所示:

function Person(name) {
    this.name = name;
    this.print1 = function() {
        return "My name is " + this.name;
    };
}

使用原型的好处是,通过new Person创建的所有对象共享相同的底层原型,因此它们共享方法,这对于内存效率很有用;当您在构造函数中定义方法时,它们不会被共享(尽管现代JavaScript引擎可以对其进行优化)。有时在构造函数中定义它们很有用,例如,当您希望它们能够访问您在对象本身上不可用的信息时(例如,真正私有 - 完整的封装 - 信息)。

使用原型也意味着,因为它们都共享相同的方法,如果有必要,您可以重新定义这些方法,并且所有现有实例立即开始使用重新定义的版本,如下所示:

function Person(name) {
  this.name = name;
}

Person.prototype.print1 = function() {
  return "My name is " + this.name;
};

var isaac = new Person("Isaac");
var joe = new Person("Joe");

snippet.log(isaac.print1()); // "My name is Isaac"
snippet.log(joe.print1());   // "My name is Joe"

Person.prototype.print1 = function() {
  return "Hi there, my name is " + this.name;
};

snippet.log(isaac.print1()); // "Hi there, my name is Isaac"
snippet.log(joe.print1());   // "Hi there, my name is Joe"
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>


任何好的JavaScript书籍都可以引导您完成这些内容,这里有一个袖手旁观的清单:

  • JavaScript:权威指南作者David Flanagan

  • Marijn Haverbeke的
  • Eloquent JavaScript (可在线免费获取)

Douglas Crockford也会推荐人们推荐 JavaScript:The Good Parts 。我不建议那些刚刚开始的人,对于那些已经熟悉语言的人来说更是如此,并且主要是一篇评论Crockford在编写时所做的和不喜欢JavaScript的观点(包括JavaScript和Crockford的自那时起,意见一直在继续)。克罗克福德很聪明,知识渊博,但不幸的是,在我看来,他并没有很好地将他的观点与事实分开,使得本书的某些部分有点误导,特别是初学者。

答案 1 :(得分:0)

您无法调用person.print1,因为您的对象中没有print1方法。从构造函数返回值不起作用,因为它已经返回了您创建的对象。

要在对象上调用方法,需要向对象添加方法。您可以在构造函数中添加方法作为属性:

    function Person(firstName) {
      this.firstName = firstName;
      this.print = function() {
        return "My name is " + this.firstName + ".";
      };
    }

    var isaac = new Person("Isaac");
    // output result in Stackoverflow snippet
    document.write(isaac.print());

您还可以将方法放在类的原型中:

function Person(firstName) {
  this.firstName = firstName;
}

Person.prototype = {
  print: function() {
    return "My name is " + this.firstName + ".";
  }
};

var isaac = new Person("Isaac");
// output result in Stackoverflow snippet
document.write(isaac.print());

您甚至可以通过在创建后向其添加方法来扩展对象:

function Person(firstName) {
  this.firstName = firstName;
}

var isaac = new Person("Isaac");
var john = new Person("John");

isaac.print = function() {
  return "My name is " + this.firstName + ".";
};

john.print = function() {
  return "Call me " + this.firstName + ".";
};

// output result in Stackoverflow snippet
document.write(isaac.print());
document.write(john.print());

答案 2 :(得分:-1)

首先,构造函数应该以大写字母开头:

var person = new Person("Isaac");

function Person(name) {
    this.name = name;
};

其次,定义一个print方法,如下所示:

function Person(name) {
    this.name = name;
    this.print = function() {
        return "My name is " + this.name;
    };
};

并调用person.print()调用它。请注意,在这种情况下,您需要在实例化Person之前定义person构造函数。

您需要在开始时进行更多操作(例如原型设计)。另外,请查看关于JavaScript对象创建模式的这篇精彩文章:http://leoasis.github.io/posts/2013/01/24/javascript-object-creation-patterns