我刚刚开始在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");
感谢您的帮助!
答案 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
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。