在javascript中的构造函数概念

时间:2016-01-14 09:11:08

标签: 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();

考虑对象,

var person = function() {
     this.firstName = "";
     this.lastName = "";
} 

当我使用时调用此对象,

var perObj = new person();

这类似于构造函数吗?

代码

的那一刻
var perObj = new person(); 
调用

会自动执行以下两行吗?

 this.firstName = "";
 this.lastName = "";

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

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

5 个答案:

答案 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中的任何函数都可以充当构造函数。

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

enter image description here

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

什么是this

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

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

关于您的上一次查询 "并且在我正在研究的一个博客中,如果文件名是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变量。

创建新对象实例时,该对象包含firstNamelastName属性,可以这样访问:

perObj.firstName;
perObj.lastName;

请注意,目前这些只分配了空字符串。

您也可以调用该方法:

perObj.fullname();

但是,此时,perObj.fullname();不会给你任何东西,因为firstNamelastName是空字符串。

您可以像在示例中一样定义它们:`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实际上是无类别的。

  1. 使用功能
  2. 使用对象文字
  3. 使用函数的单身人士
  4. 有关它的优秀文章可以在这里找到:3 ways to define a Javascript class