对Javascript构造函数和原型对象的深入理解
几种常用的对象创建模式使用新关键字创建
创建对象的最基本方法是与大多数其他语言一样:没有对象,您是新对象!
新对象();
gf.name =汤;
gf.bar =C++;
gf.saywhat =函数(){
console.log(this.name +说:永远爱你);
}
使用文字量创建
这似乎是恰当的,但如何在沉默中生活的极客享受如此复杂和低土壤的方式来定义变量呢作为一种脚本语言,它应该具有与其他兄弟相同的规范,所以有一种方法来定义对象的字体大小。
var
名称:镇
酒吧:C++
说:函数(){
console.log(this.name +说:永远爱你);
}
}
工厂模式
实际上,这是我们实践中最常用的对象定义方法,但是我有很多具有相似属性的对象。如果有一个定义,就会生成很多代码。为什么不建一个工厂,分批生产我们的产品呢所以在Javascript世界里第一个充气娃娃!
功能creategf(名字吧){
新对象();
o.name =名称;
o.bar =吧;
o.saywhat =函数(){
警报(this.name +说:永远爱你);
}
回来啊;
}
VaR GF1 = creategf(兵兵
VaR GF2 = creategf(咪咪
构造函数
工厂模式解决了创建许多相似对象的问题,但问题又来了。这些对象都是由对象生成的。如何区分它们的具体对象类型此时,我们需要切换到另一种模式,构造函数模式:
函数GF(name,bar){
this.name =名称;
this.bar =吧;
this.saywhat =函数(){
警报(this.name +说:永远爱你);
}
}
VaR GF1 =新的GF(维维安
VaR GF2 =新的GF(Vivian2
在这里,我们用在上面的例子中creategf大写字母代替构造函数开始,注意按照合同,构造函数应该大写。这里我们创建一个新的对象,然后指定的构造函数的范围到新的对象,并调用该构造函数的方法。
似乎有与上述方法没有错,但是我们可以发现在构造函数中的两个实例称为说的方法是不一样的函数实例。
console.log(gf1.saywhat = = GF2。说); / /假
同样的方法,但不同的实例的声明,这是对资源的浪费,我们可以优化的功能以外的构造函数声明说:
函数GF(name,bar){
this.name =名称;
this.bar =吧;
this.saywhat =说
}
功能说(){
警报(this.name +说:永远爱你);
}
这解决了许多实例多次定义同一个方法实例的问题,但是新的问题又来了。说我们的定义是全球范围的方法,但这种方法不能直接调用,这是有点矛盾。如何定义一个对象包更优雅让我们来看看Javascript原型对象模式。
原型对象模式
理解原型对象
当我们创建一个函数时,函数将有一个原型属性,它引用构造函数创建的函数的原型对象,最流行的观点是原型对象是内存中的对象,它为其他对象提供共享的属性和方法。
在原型模式中,不必在构造函数中定义实例属性,并将属性信息直接提供给原型对象。
函数GF(){
gf.prototype.name = 维维安;
gf.prototype.bar =C++;
gf.prototype.saywhat =函数(){
警报(this.name +说:永远爱你);
}
}
VaR GF1 =新的GF();
gf1.saywhat();
VaR GF2 =新的GF();
与构造函数不同,新对象的属性和方法由所有实例共享。换句话说,GF1和GF2访问相同的属性和方法。此外,我们的属性,也有一些内置的原型对象的属性。所有原型都有一个构造函数属性,它是一个指向原型属性函数的指针:
所有的物体都有一个原型对象(原型),原型对象的构造函数的函数原型属性包含属性、实例的GF1和GF2 GF包含原型对象的内部属性(在Firefox浏览器原私有财产),当我们访问一个对象时,首先要求实例对象如果没有财产,继续寻找原型对象。
使用原型对象
在前面的例子中,我们注意到,在属性添加到原型对象,都需要gf.prototype增加,工作是重复的,在创建对象在上述模型中,我们知道一个对象可以通过文字的形式创建的,在这里我们可以改善它:
函数(GF){ }
gf.prototype = { {
姓名:维维安
酒吧:C++
说:函数(){
警报(this.name +说:永远爱你);
}
}
这里是一个地方,我们需要特别注意,构造函数属性不再指向广发对象,因为每一个函数的定义,也会创建一个原型对象作为对象,这将自动获得一个新的构造函数的属性,这里我们使用gf.prototype精华来覆盖原来的原型对象,所以构造函数构造函数属性已成为一个新的对象,而不是女朋友,对象:
VaR GF1 =新的GF();
console.log(gf1.constructor = = GF); / /假
console.log(gf1.constructor = = / /真实对象)
在一般情况下,这种微妙的变化不会影响到我们,但如果您有特殊需要的建设者,我们可以显式地指定gf.prototype构造函数属性。
gf.prototype = { {
构造函数:GF,
姓名:维维安
酒吧:C++
说:函数(){
警报(this.name +说:永远爱你);
}
}
VaR GF1 =新的GF();
console.log(gf1.constructor = = GF); / /真的
通过原型对象模型的初步了解,我们发现所有的实例共享相同的属性,这是原型模型的基本特征,但对于开发商来说,这是一把双刃剑,在实际开发中,我们希望的例子,应该有自己的属性,没有理由单独使用这是在实际开发中的原型模式。
构造函数与原型组合模式
在实际开发中,我们可以使用构造函数定义对象的属性,使用原型定义共享的属性和方法,这样我们就可以通过不同的参数来创建不同的对象,并共享方法和属性。
函数GF(name,bar){
this.name =名称;
this.bar =吧;
}
gf.prototype = { {
构造函数:GF,
说:函数(){
警报(this.name +说:永远爱你);
}
}
VaR GF1 =新的GF(维维安
VaR GF2 =新的GF(Vivian1
在这个例子中,我们定义了对象的属性值在构造函数中,并在原型对象定义构造函数属性和说的功能,以便在GF1和GF2属性之间没有影响。这种模式也是最常用的对象的定义方式在现实发展中,包括许多的JS库(引导,等),使用默认模式。