ECMAScript 有两种开发模式:1.函数式(过程化),2.面向对象(OOP)。面向对象的语言有一个标志,那就是类的概念,而经过类能够建立任意多个具备相同属性和方法的对象。可是,ECMAScript 没有类的概念,所以它的对象也与基于类的语言中的对象有所不一样。函数
js自己是没有class类型的,可是每一个函数都有一个prototype属性。prototype指向一个对象,当函数做为构造函数时,prototype则起到相似class的做用。this
var box = new Object(); //建立一个Object 对象
box.name = 'Lee'; //建立一个name 属性并赋值
box.age = 100; //建立一个age 属性并赋值
box.run = function () { //建立一个run()方法并返回值
return this.name + this.age + '运行中...';
};
alert(box.run()); //输出属性和方法的值
上面建立了一个对象,而且建立属性和方法,而且实例化该对象,最后调用对象的方法。在run()方法里的this,就是表明box 对象自己。可是有个缺点就是不能实例化多个具备类似属性和方法的对象。因而咱们想到了可不能够有一套模板来批量制做对象。因而就有了-工厂模式。看下面例子spa
function createObject(name, age) { //集中实例化的函数
var obj = new Object();
obj.name = name;
obj.age = age;
obj.run = function () {
return this.name + this.age + '运行中...';
};
return obj;
}
var box1 = createObject('Lee', 100); //第一个实例
var box2 = createObject('Jack', 200); //第二个实例
alert(box1.run());
alert(box2.run()); //保持独立
这种方法虽然制造出来了一套模板来规范待实例化的对象。可是还有许多问题,好比建立不一样对象其中属性和方法都会重复创建,消耗内存,还有函数识别问题等等。其实还有更优秀的也是用的最多的方法,看下面示例。prototype
function Box(name, age) { //构造函数模式
this.name = name;
this.age = age;
this.run = function () {
return this.name + this.age + '运行中...';
};
}
var box1 = new Box('Lee', 100); //new Box()便可
var box2 = new Box('Jack', 200);
alert(box1.run());
alert(box1 instanceof Box); //很清晰的识别他从属于Box
这个方法看似像一个函数,但又有些不太同样。好比函数名通常都小写。若是学过其余面向对象的语言就会知道,这是类的写法(此处很少分析,非强制,但这么写有助于区分构造函数和
普通函数)。这种方法是构造函数建立对象的写法,经过构造函数建立对象,必须使用new 运算符。code
构造函数能够建立对象执行的过程:对象
1)当使用了构造函数,而且new 构造函数(),那么就后台执行了new Object();
2)将构造函数的做用域给新对象,(即new Object()建立出的对象),而函数体内的this 就
表明new Object()出来的对象。
3)执行构造函数内的代码;
4)返回新对象(后台直接返回)。blog
注:ip
1)构造函数和普通函数的惟一区别,就是他们调用的方式不一样。只不过,构造函数也是函数,必须用new 运算符来调用,不然就是普通函数。内存
2)this就是表明当前做用域对象的引用。若是在全局范围this 就表明window 对象,若是在构造函数体内,就表明当前的构造函数所声明的对象。作用域
这种方法解决了函数识别问题,但消耗内存问题没有解决。同时又带来了一个新的问题,全局中的this 在对象调用的时候是Box 自己,而看成普通函数调用的时候,this 又表明window。即this做用域的问题。