彩世界开奖app官网-彩世界平台官方网址(彩票平台)
做最好的网站
来自 彩世界平台官方网址 2019-11-28 05:40 的文章
当前位置: 彩世界开奖app官网 > 彩世界平台官方网址 > 正文

JavaScript面向对象设计二 构造函数模式_js面向对象

我们将使用构造函数模式将工厂模式进行改写。 复制代码 代码如下: function Employee { this.name = name; this.age = age; this.job = job; this.sayName = function ; }; } var Jim = new Employee("jim", 22, "SoftWare Engineer"); var Sun = new Employee; Jim.sayName; 在以上代码中Employee函数取代了CreateEmployee函数,Employee中的代码与CreateEmployee中的代码不同如下: 没有显示的创建对象 直接将属性和方法赋给了this对象 没有return语句 要创建Employee类的新实例,必须使用new操作符,实际会经历四个步骤: 创建一个新对象 将构造函数的作用域赋给新的对象 执行构造函数中代码 返回新对象 以上代码最后Jim和Sun中分别保存着Employee的两个不同实例,这两个实例都有一个constructor属性,该属性指向Employee,可以做如下测试 复制代码 代码如下: alert(Jim instanceof Employee); //true alert(Sun instanceof Employee);//true 同时这两个对象又都是Object类型的,可通过如下代码检测。 复制代码 代码如下: alert(Jim instanceof Object); //true alert(Sun instanceof Object);//true 创建自定义的构造函数意味着将来可以把它的实例标石为一种特定的类型,而这也正是构造函数模式胜过工厂模式的地方。 下面详细讲解一下构造函数: 将构造函数当做函数 构造函数与其他函数的唯一区别就在于调用它们的方式不同。但是构造函数也是函数,不存在定义构造函数的特殊语法。其实,任何函数,只有通过new来调用,那他就可以作为构造函数,例如,Employee除了以上用new方法调用外,还可以用如下方式来调用。 复制代码 代码如下: //作为普通函数调用 Employee("Sun", 28, "SoftWare Engineer"); //添加到window中 window.sayName();//Sun 复制代码 代码如下://在另一个对象的作用域中调用 var o = new Object(); Employee.call(o, "Sun", 28, "SoftWare Engineer"); o.sayName();//Sum 构造函数的问题 使用构造函数的主要问题就是都要在每个实力上重新创建一遍,以上两个对象中的sayName方法其实是不同的Function的实例,可以用如下方法证明: alert(Jim.sayName == Sun.sayName);//false 但是创建两个完成同样任务的Function实例,所以我们对上面的函数进行改写,如下 复制代码 代码如下: function Employee { this.name = name; this.age = age; this.job = job; this.sayName =sayName; } function sayName; } 这样就解决了两个函数做同一件事情的问题,但是新的问题又会出现了,这个在全局作用域中定义的函数,实际上只能被某个对象引用,而且最要命的问题是,如果对象需要定义很多方法,那么就需要定义很多个全局函数,所以这个自定义的引用类型,就没有任何封装性可言了.

构造函数模式与工厂模式区别:

创建自定义构造函数,意味着可以将它的实例标识为一种特定类型,即胜过工厂模式的地方

构造函数(“构造”为需要的样子)特征:
  1. 函数体内部使用了this关键字,代表了所要生成的对象实例。
  2. 生成对象的时候,必需用new命令
new过程时发生了什么?
  1. 创建一个新对象
  2. 将构造函数的作用域赋值给新对象
  3. 执行构造函数的代码(即为新对象添加属性)
  4. 返回新对象

彩世界平台官方网址 1

二、构造函数模式-字面量创建对象

var Person = function(name ,age, job){
this.name = name;
this.age = age;
this.job = function(){
alert(this.name);
};
}

var person1 = new Person("shan", 22, "SoftWare Engineer");
var person2 = new Person("fan", 22, "SoftWare Engineer");

alert(person1 instanceof Object); //true
alert(person1 instanceof Person); //true
alert(person2 instanceof Object); //true
alert(person2 instanceof Person); //true
//person1,person2同时是Object实例,因所有对象均继承自Object

构造函数当作普通函数使用

Person("shan", 22, "SoftWare Engineer"); //此时函数中this指向全局,即window。
window.job(); //"shan"

在另一个对象的作用域中调用

var o = new Object();
Person.call(o,"shan", 22, "SoftWare Engineer"); //固定this方法:call,apply,bind
o.job(); //"shan"

一、工厂模式(抽象了创建具体对象的过程)--用函数来封装以特定接口创建对象细节

function createPerson(name, age, job){
var o = new Object();
o.name = name;
o.age = age;
o.job = function(){
alert(this.name);
};
return o;
}

var person1 = createPerson("shan", 22, "SoftWare Engineer");
var person2 = createPerson("fan", 23, "SoftWare Engineer");

alert(person1 instanceof Object); //true
alert(person2 instanceof Object); //true

面向对象.png

创建对象

构造函数问题:

以上构造函数实例中,函数内部job(),实例化person1和person2时,是不同的实例,这样每实例化一次,每个方法都在实例上重新创建一遍。

问题:
  1. 什么是构造函数?
  2. 构造函数与普通函数区别是什么?
  3. 使用new关键字时发生了什么?
  4. 构造函数中有返回值怎么办?
  5. 构造函数能当普通函数调用吗?

本文由彩世界开奖app官网发布于彩世界平台官方网址,转载请注明出处:JavaScript面向对象设计二 构造函数模式_js面向对象

关键词: 脚本 前端 函数 之家 面向对象