在我的一个问题中,我得到以下代码作为答案之一。我对语言的理解已经变得更好了, 只有一个小问题。
var person = function() {
this.firstName = "";
this.lastName = "";
}
person.prototype.showFullName = function () {
console.log(this.firstName + " " + this.lastName);
}
var perObj = new person();
perObj.firstName = "Penelope";
perObj.lastName = "Barrymore";
perObj.showFullName();
考虑对象,
var person = function() {
this.firstName = "";
this.lastName = "";
}
当我使用时调用此对象,
var perObj = new person();
这类似于构造函数吗?
代码
的那一刻var perObj = new person();
调用会自动执行以下两行吗?
this.firstName = "";
this.lastName = "";
在我正在研究的一个博客中,如果文件名是Samplescript.js
,并且如果在var Samplescript=function(){}
内部使用相同的名称编写函数,这个函数会被视为构造函数吗?
请澄清一下。
尽管理论上事情很清楚,但实际上我并没有得到任何关于构造函数的令人满意的答案,在这个例子中,它的编写方式很清楚。
答案 0 :(得分:13)
首先,person
是一个常规的JavaScript函数。当你打电话时,当然是行:
this.firstName = "";
this.lastName = "";
被执行。 构造函数是一个概念,而不是JS语言中真正存在的东西。您需要构造函数通过调用new MyCtr()
来创建新的类似对象。同时,您需要常规函数来封装逻辑片段,并使其可以在不同的地方重复使用,而无需复制/粘贴代码。
您可以将JavaScript中的所有函数用作构造函数。只需在函数调用表达式前添加new
关键字即可。这件事改变了函数执行的 context 。如果没有new
,则会对全局对象(浏览器中的window
)执行该功能。函数内的this
变量引用上下文。
并非每个函数都准备好成为构造函数。通常,构造函数正在使用this
变量执行某些操作,该变量是对new MyCtr()
调用期间创建的对象的引用。此外,构造函数永远不会返回值。
让我们看几个例子(你可以直接在浏览器的控制台中执行它):
function foo() {
this.a = 1;
}
foo(); // using function as a regular function. Ctx is window.
console.log(window.a); // prints "1"
foo.call(window); // explicitly specify execution ctx. The same as just foo() call
var instance = new foo(); // using foo as a constructor
console.log(instance.a); // prints "1"
// actually you can do it without new keyword
var instance = {}; // manually create new object
foo.call(instance); // manually call foo against this object
console.log(instance.a); // prints "1"
// However, the code above is not strictly equivalent to the code using new.
// It omits the concept of prototype, but it's enough for our current task.
关于功能和文件。像Java这样的语言中没有这样的东西,每个类必须放在单独的文件中。您可以将所有函数放在一个文件中,然后将其用作构造函数。但是,最佳做法是为每个文件(称为模块)驻留一个构造函数(读作类)。
答案 1 :(得分:8)
当使用new运算符调用函数时,JavaScript中的任何函数都可以充当构造函数。
现在,构造函数的作用是什么? 它从构造函数创建/实例化一个对象。,如下图所示。
LINK,它非常清楚地解释了基本原理。
什么是this
?
当使用new调用此构造函数时,this
指向在该调用时创建的新对象。在该对象中,我们设置firtName
和lastName
(这是创建的新对象的初始化)。
现在,当我们向构造函数的原型添加方法时,在使用构造函数创建的所有对象之间共享(图片说明它更多点亮了)
关于您的上一次查询 "并且在我正在研究的一个博客中,如果文件名是Samplescript.js,并且如果函数是使用相同的名称编写的,例如var samplescript = function(){},则此函数将被视为构造函数?请告诉我这个"
当使用new运算符调用函数时,JavaScript中的任何函数都可以充当构造函数,而不是博客所说的。
所以请停止阅读该博客,我提供的链接是一个非常好的起点
答案 2 :(得分:3)
您的理解似乎存在一些漏洞。希望我能提供帮助。
首先,构造函数的传统常规语法是function CapitalisedFunctionName()
function Person() {
this.firstName = "";
this.lastName = "";
}
注意:这不是对象。从你的问题来看,你不明白这一点。
此时,您可以添加原型,从该构造函数创建的所有新对象都将从该原型继承。您示例中的此修改方法将可用于所有新对象。
Person.prototype.fullname = function () {
return this.firstName + " " + this.lastName;
}
现在,构造函数允许您创建新的对象实例。所以当你写:
var perObj = new person();
您正在调用构造函数,创建新的对象实例,并将该实例分配给perObj
变量。
创建新对象实例时,该对象包含firstName
和lastName
属性,可以这样访问:
perObj.firstName;
perObj.lastName;
请注意,目前这些只分配了空字符串。
您也可以调用该方法:
perObj.fullname();
但是,此时,perObj.fullname();
不会给你任何东西,因为firstName
和lastName
是空字符串。
您可以像在示例中一样定义它们:`perObj.lastName ='Jones',或者您甚至可以改变创建对象的方式,通常是首选方法:
考虑一下:
function Person(first, last) {
this.firstName = first;
this.lastName = last;
}
var perObj = new Person('Dave', 'Jones');
现在perObj
将预填充这些属性:
perObj.firstName // Dave
perObj.lastName // Jones
perObj.fullname() // Dave Jones
答案 3 :(得分:1)
使用new
运算符调用的任何函数都充当构造函数,因此this
将分配给新对象并指向它。此外,构造函数中的代码将被执行,新对象(perObj
)将获得属性。
答案 4 :(得分:1)
有几种方法可以定义Javascript类并使用构造函数调用它们。但请记住,JavaScript实际上是无类别的。
有关它的优秀文章可以在这里找到:3 ways to define a Javascript class