在javascript中的构造函数概念

use*_*721 9 javascript javascript-events

在我的一个问题中,我得到以下代码作为答案之一.我对语言的理解现在变得更好了,只有一个小问题.

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();
Run Code Online (Sandbox Code Playgroud)

考虑到对象,

var person = function() {
     this.firstName = "";
     this.lastName = "";
} 
Run Code Online (Sandbox Code Playgroud)

当我用这个对象来称呼时,

var perObj = new person();
Run Code Online (Sandbox Code Playgroud)

这类似于构造函数的东西吗?

一刻代码

var perObj = new person(); 
Run Code Online (Sandbox Code Playgroud)

被调用会自动执行以下两行吗?

 this.firstName = "";
 this.lastName = "";
Run Code Online (Sandbox Code Playgroud)

而且在我正在研究的一个博客中,如果文件名是Samplescript.js,如果函数是使用相同的名称编写的var Samplescript=function(){},那么这个函数会被视为构造函数吗?请澄清一下这个.

尽管理论上事情很清楚,但实际上我并没有得到任何关于构造函数的令人满意的答案,在这个例子中,它的编写方式有很多清晰的理解.

Iva*_*hko 13

首先person是常规的JavaScript函数.当你调用它时,当然是行:

this.firstName = "";
this.lastName = "";
Run Code Online (Sandbox Code Playgroud)

执行.构造函数是一个概念,而不是JS语言中真正存在的东西.您需要构造函数通过调用来创建新的类似对象new MyCtr().同时,您需要常规函数来封装逻辑片段,并使其可以在不同的地方重复使用,而无需复制/粘贴代码.

您可以将JavaScript中的所有函数用作构造函数.只需new在函数调用表达式前添加关键字.这件事改变了函数执行的上下文.没有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.
Run Code Online (Sandbox Code Playgroud)

关于功能和文件.像Java这样的语言中没有这样的东西,每个类必须放在单独的文件中.您可以将所有函数放在一个文件中,然后将其用作构造函数.但是,最佳实践是每个文件(称为模块)驻留一个构造函数(作为读取).

  • "*您可以使用JavaScript中的所有函数作为构造函数.*" - 不是.有可构造对象和可调用对象,并非所有对象都是可用对象.(虽然使用`function`关键字创建的那些) (3认同)

Oxi*_*Oxi 8

当使用new运算符调用函数时,JavaScript中的任何函数都可以充当构造函数.

现在,构造函数的作用是什么? 它从构造函数创建/实例化一个对象. 如下图所示.

在此输入图像描述

LINK ,它非常清楚地解释了基本原理.

是什么this

当使用new调用此构造函数时,this指向在该调用时创建的新对象.在那个对象中我们设置firtNamelastName(它是创建的新对象的初始化).

现在,当我们向构造函数的原型添加方法时,在使用构造函数创建的所有对象之间共享(图片说明它点亮了更多)

并且关于你的上一个查询 "并且在我正在研究的一个博客中,如果文件名是Samplescript.js,并且如果函数是使用相同的名称编写的,例如var samplescript = function(){},那么这个函数是被认为是构造函数?请澄清这个"

当使用new运算符调用函数时,JavaScript中的任何函数都可以充当构造函数,而不是博客所说的那样.

所以请停止阅读该博客,我提供的链接是一个非常好的起点