学习笔记的Javascript函数文本(五):构造函数
在构造函数体中,这指向新创建的对象。如果构造函数没有返回在主体中显示的表达式,则我们默认返回这个,这是新对象。
复制代码代码如下所示:
函数(){
this.bla = 1;
}
foo.prototype.test =函数(){
(这console.log。BLA);
};
var测试=新富();
上面的代码调用foo作为构造函数和点的原型(__proto__)的新对象foo.prototype。
如果我们在构造函数中定义返回的返回表达式,构造函数将返回整个表达式,但是这个返回表达式必须是一个对象。
复制代码代码如下所示:
函数条(){
返回2;
}
新建(bar);一个新对象
函数测试(){
this.value = 2;
返回{
食品:1
};
}
新的(测试);返回的对象
如果省略了新函数,那么函数将不会返回到一个新对象。
复制代码代码如下所示:
函数(){
this.bla = 1; / /被设置在全局对象
}
(富);未定义的
上述示例也可能在某些场景中运行,但由于Javascript中的这种工作机制,这将指向全局对象。
工厂模式
为了不使用关键字new,构造函数必须显示一个值的返回值。
复制代码代码如下所示:
函数条(){
var值= 1;
返回{
方法:函数(){
返回值;
}
}
}
bar.prototype = { {
符:(函数){ }
};
新酒吧();
(酒吧);
在这个例子中,新调用的bar函数实现的效果是一样的,对象将返回一个新的方法,包括方法,这里实际上是一个闭包。
需要指出,新的酒吧()不会返回bar.prototype,但原型对象的函数在返回表达式。
在这个例子中,使用新的函数是否有差异。
通过工厂模式创建新对象
我们经常被提醒不要使用新的,因为一旦忘记它就会导致错误。
为了创建一个对象,我们更愿意使用工厂模式,并在工厂模式中构建一个新对象。
复制代码代码如下所示:
函数(){
var obj = { };
obj.value = 'blub;
VaR的私人= 2;
obj.somemethod =函数(值){
this.value =价值;
}
obj.getprivate =函数(){
回归民间;
}
返回对象;
}
虽然这种代码比使用新的错误容易得多,但在使用私有变量时也会比较方便,但也有一些不错的地方:
因为不能共享原型对象,所以需要更多内存。
为了继承,工厂模式需要复制另一个对象的所有方法,或者使用它作为新对象的原型。
放弃原型链只是为了避免使用新的,这似乎违背了Javascript语言的精神。
总结
虽然使用新的可能更容易产生错误,但这并不是放弃使用原型链的原因,至于最后的方法是什么,这取决于应用程序的需求,最好的方法是选择一种风格并坚持下去。
简单地说,构造函数是初始化一个实例对象,对象的原型属性是继承一个实例对象。