javascript——构造函数模式

var o = new Array();

我们创建了一个对象,这个对象是个数组类型,Array就是一个原生构造函数。显而易见,构造函数模式就是让我们知道如果我们要创建一个Person(),如何能使它像Array()一样可以通过new一个类来创建对象实例,且这个对象实例被标记为Person类型

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

}
var person1= new Person("guoshiwei", 23, "web");
var person2 = new Person("Nicholas", 29, "Software Engineer");

这段代码使用构造函数模式,通过构造函数模式创建实例的时候,必须使用new操作符,通过new操作符,实例就被标识为Person类型(构造函数最大的好处)

注意:

Person 首字母要大写,因为构建函数模式它本身也是一个函数,为了区别,构建函数模式的函数首字母大写

通过new创建新实例的过程如下(注释后为个人理解)

  1. 创建一个新对象;        //在内存中开辟一个空间  object类型对象  所有还没有定义的对象都是object对象
  2. 将构造函数的作用域赋给新对象(因此this就指向了这个新对象);//将Person类中的类或方法复制一份放到这个空间中去,此时这个对象变成  Person类型对象  constructor属性指向Person  表明你得到的这些属性和方法来自哪
  3. 执行构造函数中的代码(对这个新对象添加属性);     //把你的参数代入到这个空间的属性或方法中
  4. 返回新对象;    //把这个对象连接到person1上

到此为止,一个Person类型的person1对象实例就完成了,但是注意到的是,通过new操作符创建的对象实例,第二步时,我的理解是它是将Person类中的属性和方法复制一份给自己,而不是引用来自Person的属性和方法。(每个属性和方法都是自己的)

alert (person1.sayName == person2.sayName);   //false

这就造成了一种不方便(我理解为浪费),那就是每创建一个实例,都要重新生成一个sayName函数。

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

var person1=new Person("guoshiwei", 23,"web");
var person1=new Person("Nicholas", 29,"Software Engineer");

你可以这样在函数外创建sayName函数,这样person1和person2都通过sayName对象引用sayName()方法,但是如果你还需要sayAge, sayJob函数就显的比较麻烦了,一旦你需要的方法多了,就得不偿失,而且降低了Person函数的封装性,所以为了解决这个问题,又出现了一种新的模式——原型模式

时间: 2024-07-29 21:08:26

javascript——构造函数模式的相关文章

Javascript 构造函数模式、原型模式

前两天写完组合继承,打算总结一下原型继承的,不过今天看了一下工厂模式.构造函数模式和原型模式,觉得有必要总结一下以加深印象. ——————————————————————————————————————————————————————————————————————————————————碎碎念. 1.工厂模式 <Javascript 高级程序设计(第3版)> 用了寥寥十多行介绍了工厂模式.我找了一些相关资料,想确定一下这种模式的具体适用场景和优势.按照资料中的说法,是考虑到 ECMAScri

JavaScript 创建对象之单例、工厂、构造函数模式

01单例模式 首先看一个问题,我们要在程序中描述两个人,这两个人都有姓名和年龄,可能刚刚开始学习js的时候会写成这样: 1 var name1 = 'iceman'; 2 var age1 = 25; 3 4 var name2 = 'mengzhe'; 5 var age2 = 26; 以上的写法的确是描述两个人,每个人都有姓名和年龄,但是每个人的姓名和年龄并没有放在一起,也就是说每个人的年龄和姓名并没有对应起来.这时候我们就引出对象的概念:把描述同一个事物(同一个对象)的属性和方法放在同一个

JavaScript构造函数+原型创建对象,原型链+借用构造函数模式继承父类练习

虽然经常说是做前端开发的,但常常使用的技术反而是JQuery比较多一点.在JavaScript的使用上相对而言少些.尤其是在创建对象使用原型链继承上面,在项目开发中很少用到.所以今天做个demo练习一下,以后忘记了也可以照搬一下. 说明一下: 1. Demo中使用的是构造函数+原型模式创建的对象.构造函数中存储对象实例使用的属性,原型模式增加实例使用的方法. 2. Demo中的继承分为两个方面.一个是属性继承,使用的是借用构造函数模式 call()方法.另一个是方法继承,这个就是使用原型方式继承

javascript工厂模式和构造函数模式创建对象

一.工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程(本书后面还将讨论其他设计模式及其在JavaScript 中的实现).考虑到在ECMAScript 中无法创建类,开发人员就发明了一种函数,用函数来封装以特定接口创建对象的细节,如下面的例子所示. function createPerson(name, age, job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.s

JavaScript创建对象之单例、工厂、构造函数模式

// 单例模式 解决分组问题 让每个对象有自己的命名空间 var person1 = { name: "icss"; age: 25; }; var person2 { name: "sas"; age: 26 } // 工厂模式 实现同一事情的代码 放在一个函数中 其实就是函数的封装 体现了高内聚 低耦合 function createPerson(name, age) { var obj = {}; obj.name = name; obj.age = age;

深入理解JavaScript系列(26):设计模式之构造函数模式

介绍 构造函数大家都很熟悉了,不过如果你是新手,还是有必要来了解一下什么叫构造函数的.构造函数用于创建特定类型的对象——不仅声明了使用的对象,构造函数还可以接受参数以便第一次创建对象的时候设置对象的成员值.你可以自定义自己的构造函数,然后在里面声明自定义类型对象的属性或方法. 基本用法 在JavaScript里,构造函数通常是认为用来实现实例的,JavaScript没有类的概念,但是有特殊的构造函数.通过new关键字来调用定义的否早函数,你可以告诉JavaScript你要创建一个新对象并且新对象

JavaScript创建对象的默认方式:组合使用构造函数模式和原型模式

由于 JavaScript中没有类,对象充当着一系列集合的模板,包含着属性和方法,而每个对象中也有一个原型对象,可以存放共享方法和属性 . 创建自定义类型的最常见方式,就是组合使用构造函数模式与原型模式.构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性 //组合使用构造函数模式(构造函数设置自己的属性)和原型模式(原型设计那些共享的方法和属性) function Person(name,age,job){ this.name=name; this.age=age; this.jo

JavaScript面向对象OOM 2(JavaScript 创建对象的工厂模式和构造函数模式)

??在创建对象的时候,使用对象字面量和 new Object() 构造函数的方式创建一个对象是最简单最方便的方式.但是凡是处于初级阶段的事物都会不可避免的存在一个问题,没有普适性,意思就是说我要为世界上(程序中)的所有使用到的对象都使用一遍 var xxx = {} ,对于'懒惰'的程序员来讲是不可以接受的.即便你能接受这种创建的方式,也无法保证将所有对象归类这一哲学问题. ??由此,优秀的程序员们利用现有的规则,创造出了一种种优秀的解决方案 -- 这些优秀的解决方案统称为设计模式. ??在 J

浅议javascript的工厂模式,构造函数模式及原型模式

通常来讲我们一般这样创建对象: (1)  var jxj=new Object(); jxj.name="jxj"; jxj.sayHi=function(){console.log("O(∩_∩)O哈哈哈~")}: (2)  var   jxj={name:"jxj",age:"24",.....} 这两种方式在一些场景简单,规模小的项目中使用,我们还可以忍受:但这种方式在可拓展性,可维护性等等方面有很多的问题,于是,就出现