请仅提供您对Javascript的想法!我知道类和经典继承,但不是很详细。
据我所知,构造函数被用作其他对象的原型。例如,我可以创建一个汽车构造函数并为其提供诸如hondaCivic,toyotaCamry等对象。是否还有其他关于构造函数的重要事项?
此外,
答案 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
:
构造函数和“非构造函数”函数之间的唯一区别是前者可以在new
表达式中使用:
honda = new Car()
new
表达式做了三件事:
__proto__
属性this
这个最终的对象关系如下所示:
当您重新定义默认的prototype
时,构造函数开始有意义,从而创建一个典型的继承链:
function Vehicle() {}
function Car() {}
Car.prototype = new Vehicle;
honda = new Car;
现在honda
继承自Car.prototype
,Vehicle.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
:
答案 2 :(得分:0)
构造函数用作其他对象的原型。
不,他们不是 - 如果你的意思是&#34;继承目标&#34;通过术语&#34;原型&#34;。
例如,我可以创建一个汽车构造函数并为其提供诸如hondaCivic,toyotaCamry等对象。
不确定你的意思。如果您对此有疑问,请出示代码。
构造函数的目的是什么?
与其他语言没有区别,constructor function的目的是初始化一个实例
在JS中,您可以使用new
运算符调用它来创建实例(对象)。
构造函数的好处/缺点是什么?
它完成了它的工作。有时,它是用于工作的错误工具。