1

构造函数

上一章我们讲了工厂模式,它的缺点就是无法识别到底哪个属于哪个的问题。我们可以用构造函数来解决这个识别问题。

//构造函数

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**

Brian_Lee
397 声望40 粉丝

人生为棋,我愿为卒,行动虽慢,可谁见我曾后退一步!