构造函数
上一章我们讲了工厂模式,它的缺点就是无法识别到底哪个属于哪个的问题。我们可以用构造函数来解决这个识别问题。
//构造函数
function Create(a,b) {
this.a =a;
this.b =b;
this.c = function () {
return this.a + this.b;
};
}
var box = new Create('abc',10);
alert(box.run()); //返回abc10
我们参考上一章,发现构造函数和工厂模式的区别:
1.没有集中实例化
2.没有返回对象实例
3.直接将属性和方法赋值给this
1.我们不需要在构造函数内集中实例化,因为在创建构造函数的同时,后台会自动创建一个实例化。
2.我们不需要返回这个对象的实例化,因为它是后台自动返回的。
3.this就相当于工厂模式的obj.a;
解决对象实例归属问题
如果我们想查看归属问题。必须要创建两个构造函数:
function Create(a,b) {
this.a =a;
this.b =b;
this.c = function () {
return this.a + this.b;
};
}
function DeskTop(a,b) {
this.a =a;
this.b =b;
this.c = function () {
return this.a + this.b;
};
}
var box = new Create('abc',10);
var box1 = new DeskTop('def',20);
alert(box instanceof Object);
//这里要注意:所有的构造函数的对象都是Object.
alert(box instanceof Create); //true
alert(box1 instanceof Create); //false
alert(box1 instanceof DeskTop); //true
构造函数编写规范:
1.构造函数也是函数,但是函数名的第一个字母大写
2.必须使用new运算符
3.必须使用new + 等同上面的函数名(首字母大写)例如:var box = new Create();
构造函数和普通函数的区别:
1.普通函数,首字母无需大写
2.构造函数,用普通函数调用方式无效
构造函数内的方法是:基本类型 or 引用类型??
我们可以通过例子来看出来到底是普通类型还是引用类型:
function Create(a,b) {
this.a =a;
this.b =b;
this.c = function () {
return this.a + this.b;
};
}
var abc = new Create('abc',10);
var abc1 = new Create('abc',10);
我们讲两个传同样的值。来比较构造函数内的值就可以看出到底是什么类型。
alert(abc.a == abc1.a); //true
//因为传进去的实参相同,肯定是相同的
alert(abc.b == abc1.b); //true
//同上
alert(abc.c == abc1.c); //false
//这里看出,他们比较的是引用地址,大家都知道引用地址肯定不相等!
基本数据类型的变量存放的是基本类型数据的实际值。而引用数据类型的变量保存对它的引用,即指针。
注:为什么用abc.c而不是abc.c(),因为abc.c是表示的引用地址,而abc.c()是返回这个引用类型的值。
如果大家还没懂为什么,可以用一张图来解释:
基本类型和引用类型
虽然这个与今天的话题好像没啥太大关系。但是我感觉我们还是有必要复习一下基础知识。
基本类型:
基本类型的比较是值的比较
基本类型是存放在栈内存中的。
基本类型的值是无法改变的。
引用类型:
引用类型的值是可以改变的。
引用类型的比较是引用的比较
引用类型是同时存放在栈内存和堆内存中的。
(栈内存中存放的是这个变量名,而堆内存存放的是地址,我们去调用时会有一个指针指向堆内存的。)
而每次实例化,地址都不相同,所以比较引用类型的地址肯定不相同!!!
下一章我们来讲原型。
文章内容有错误请及时联系作者指正!谢谢!
**Brian Lee**
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。