第五章 web前端开发工程师--JavaScript高级程序设计 5-6 JavaScript对象函数

                                                                               JavaScript对象函数

 

本节课所讲内容:

  1. JavaScript 对象创建
  2. JavaScript对象基本操作
  3. JavaScript对象的函数

                                                                                主讲教师:Head老师

三.对象的函数

为了解决多个类似对象声明的问题,我们可以使用一种叫做工厂模式的方法,这种方法就是为了解决实例化对象产生大量重复的问题。

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()); //保持独立

 

工厂模式解决了重复实例化的问题,但还有一个问题,那就是识别问题,因为根本无法搞清楚他们到底是哪个对象的实例。

alert(typeof box1); //Object

alert(box1 instanceof Object); //true

 

ECMAScript中可以采用构造函数(构造方法)可用来创建特定的对象。类型于Object对象。

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 Object(),为什么可以实例化Box(),这个是哪里来的呢?

使用了构造函数的方法,和使用工厂模式的方法他们不同之处如下:

构造函数方法没有显示的创建对象(new Object());

直接将属性和方法赋值给this对象;

没有renturn语句。

 

构造函数的方法有一些规范:

1.函数名和实例化构造名相同且大写,(PS:非强制,但这么写有助于区分构造函数和普通函数);

2.通过构造函数创建对象,必须使用new运算符。

 

既然通过构造函数可以创建对象,那么这个对象是哪里来的,new Object()在什么地方执行了?执行的过程如下:

当使用了构造函数,并且new 构造函数(),那么就后台执行了new Object();

将构造函数的作用域给新对象,(即new Object()创建出的对象),而函数体内的this就代表new Object()出来的对象。

执行构造函数内的代码;

返回新对象(后台直接返回)。

 

关于this的使用,this其实就是代表当前作用域对象的引用。如果在全局范围this就代表window对象,如果在构造函数体内,就代表当前的构造函数所声明的对象。

var box = 2;

window.alert(this.box); //全局,代表window

 

构造函数和普通函数的唯一区别,就是他们调用的方式不同。只不过,构造函数也是函数,必须用new运算符来调用,否则就是普通函数。

var box = new Box('Lee', 100); //构造模式调用

alert(box.run());

 

Box('Lee', 20); //普通模式调用,无效

 

var o = new Object();

Box.call(o, 'Jack', 200) //对象冒充调用

alert(o.run());

 

探讨构造函数内部的方法(或函数)的问题,首先看下两个实例化后的属性或方法是否相等。

var box1 = new Box('Lee', 100); //传递一致

var box2 = new Box('Lee', 100); //同上

 

alert(box1.name == box2.name); //true,属性的值相等

alert(box1.run == box2.run); //false,方法其实也是一种引用地址

alert(box1.run() == box2.run()); //true,方法的值相等,因为传参一致

可以把构造函数里的方法(或函数)用new Function()方法来代替,得到一样的效果,更加证明,他们最终判断的是引用地址,唯一性。

function Box(name, age) { //new Function()唯一性

this.name = name;

this.age = age;

this.run = new Function("return this.name + this.age + '运行中...'");

}

 

猜你喜欢

转载自blog.csdn.net/wgf5845201314/article/details/92381075
今日推荐