Javascript构造函数有什么意义?

时间:2015-07-25 19:39:12

标签: javascript constructor

请仅提供您对Javascript的想法!我知道类和经典继承,但不是很详细。

据我所知,构造函数被用作其他对象的原型。例如,我可以创建一个汽车构造函数并为其提供诸如hondaCivic,toyotaCamry等对象。是否还有其他关于构造函数的重要事项?

此外,

  1. 除了我已经说过的内容之外,构造函数的目的是什么?
  2. 构造函数的好处/缺点是什么?

3 个答案:

答案 0 :(得分:5)

构造函数只是一个普通的函数。它本身没什么特别的。

所有函数都有一个名为prototype的属性。

如果你写

var myInstance = new MyFuction();

JavaScript在执行时会对您的函数执行一些特殊操作。

它将函数体内this的值设置为myInstance。 此外,它会创建对MyFunction.prototype的引用,并将其存储为myInstance的内部属性。

当您的代码正在执行时,解释器遵循的规则是,如果您尝试访问myInstance上无法找到的属性,它将遵循对该函数的{{1看那里这形成了一条链,称为原型链,一直延伸到prototype

以下是一个例子:

Object.prototype

上面的代码段有效,但如果您运行:function Dog(name, breed) { this.name = name; this.breed = breed; //if you don't specify a return value, `this` will be returned } Dog.prototype.speak = function() { alert('Ruff, I\'m ' + this.name + ' the talking ' + this.breed); } var myDog = new Dog('buttercup', 'poodle'); myDog.speak();,您会看到它没有说话方法。说话方法是在它的原型中找到的。

这意味着创建的console.log(myDog)的所有“实例”都将共享相同的Dog方法。

所以,如果我创造另一只狗,它也可以说:

speak

var tommysDog = new Dog('rosco', 'pitbull');
tommysDog.speak(); //tommy's dog can speak too

这也意味着如果我在运行时更改 function Dog(name, breed) { this.name = name; this.breed = breed; //if you don't specify a return value, `this` will be returned } Dog.prototype.speak = function() { alert('Ruff, I\'m ' + this.name + ' the talking ' + this.breed); } var myDog = new Dog('buttercup', 'poodle'); var tommysDog = new Dog('rosco', 'pitbull'); tommysDog.speak();的值,则所有实例都将受到影响。

注意:从技术上讲,函数确实有一个Dog.prototype.speak属性,但 并不重要,如果我试图在这里解释它会让你更加困惑。

我建议你阅读mozilla docs

此外,我建议你阅读this book。你会学到很多关于正确设计的知识。

另请注意,这只是实现代码重用的一种方法。你根本不必经历原型。事实上,JavaScript有一些方法可以让你提供任意值作为constructor的值作为参数。

这意味着,即使我的宠物蜥蜴通常无法说话,我也可以通过call()apply()等方法从this借用该方法。 (所有函数都有这些方法,因为它们'Dog.prototype继承了它们。)

Function.prototype

答案 1 :(得分:2)

Javascript中的“构造函数”只是一个具有称为“prototype”的特殊属性的函数。大多数(但不是全部)内置和所有用户定义的函数也是构造函数。定义函数时,如

function Car() {}

你实际创建了两个对象:一个函数及其原型,默认为空object

enter image description here

构造函数和“非构造函数”函数之间的唯一区别是前者可以在new表达式中使用:

honda = new Car()

new表达式做了三件事:

  • 分配新的通用对象
  • 将构造函数的原型复制到此对象的内部__proto__属性
  • 执行构造函数体,将新创建的对象作为this
  • 传递

这个最终的对象关系如下所示:

enter image description here

当您重新定义默认的prototype时,构造函数开始有意义,从而创建一个典型的继承链:

function Vehicle() {}

function Car() {}

Car.prototype = new Vehicle;

honda = new Car;

现在honda继承自Car.prototypeVehicle.prototype继承自Sub OnOpen() Dim Page As Integer Dim Fin As Integer Windows("Dok1.docm").Activate Call SearchAndMark("Article : KR", "DéfautsKR") Call SearchAndMark("Article : IP", "DéfautsIP") End Sub '--------------------------------------------- Sub SearchAndMark(searchString As String, markText As String) Dim CurrentPage As Integer Dim LastPage As Integer Selection.GoTo What:=wdGoToPage, Which:=wdGoToFirst CurrentPage = Selection.Information(wdActiveEndAdjustedPageNumber) LastPage = Selection.Information(wdNumberOfPagesInDocument) While (CurrentPage < LastPage) Selection.Find.Forward = True Selection.Find.Text = searchString Selection.Find.Execute If Selection.Find.Found Then CurrentPage = Selection.Information(wdActiveEndAdjustedPageNumber) Debug.Print "Found on Page " & CurrentPage Call ActiveDocument.Footnotes.Add(Selection.Range, "", markText) Else 'To exit the loop if the search string isn't found (anymore) CurrentPage = LastPage End If Wend End Sub

enter image description here

答案 2 :(得分:0)

  

构造函数用作其他对象的原型。

不,他们不是 - 如果你的意思是&#34;继承目标&#34;通过术语&#34;原型&#34;。

  

例如,我可以创建一个汽车构造函数并为其提供诸如hondaCivic,toyotaCamry等对象。

不确定你的意思。如果您对此有疑问,请出示代码。

  

构造函数的目的是什么?

与其他语言没有区别,constructor function的目的是初始化一个实例 在JS中,您可以使用new运算符调用它来创建实例(对象)。

  

构造函数的好处/缺点是什么?

它完成了它的工作。有时,它是用于工作的错误工具。