zoukankan      html  css  js  c++  java
  • 《JS设计模式笔记》构造函数和工厂模式创建对象

    工厂模式

     1 function createPerson (name,age,job) {
     2           var o=new Object();
     3           o.name=name;
     4           o.age=age;
     5           o.job=job;
     6           o.sayName=function(){
     7               alert(this.name);
     8           };
     9           return o;
    10       }; 
    11       var person1=createPerson("Terry",24,"Software Engineer");
    12       person1.sayName();
    13       var Person2=createPerson("Terry2",24,"Software Engineer2");
    14       person2.sayName();

    构造函数模式

     1  function Person(name,age,job){
     2           this.name=name;
     3           this.age=age;
     4           this.job=job;
     5           this.sayName=function(){
     6               alert(this.name);
     7           }
     8       }
     9       var person1=new Person("Terry",23,"Engineer Software");
    10       person1.sayName();

      person1对象有一个constructor属性,该属性指向Person,constuctor属性最初是用来标识对象类型的。但是 instanceof操作符要更可靠一些。

    1 alert(person1 instanceof Object);//ture
    2 alert(person1 instanceof Person);//ture

      自定义构造函数意味着将来可以将它的实例标识为一种特定的类型,这正是构造函数模式胜过工厂模式的地方。
      构造函数也是函数,任何函数只要通过new操作符来调用,那它就可以做为构造函数;而任何函数不通过new操作符来调用,那它跟普通函数也不会有什么两样。

    1、当做构造函数来使用

    1 var person=new Person("Terry",23,"Software Engineer");
    2 person.sayName();

    2、作为普通函数来调用

    1 Person("Terry",25,"Doctor");
    2 window.sayName();

    3,在另一对象作用域中调用

    1 var o=new Object();
    2 Person.call(o,"Terry",23,"Nurse");
    3 o.sayName();

      当在全局作用域中调用一个函数时, this对象总是指向Global对象(在浏览器中就是window对象)。

      因此,在调用完函数之后,可以通过window对象来调用sayName()方法,并且还返回了"Terry"。

      最后,也可以使用 call()(或者 apply())在某个特殊对象的作用域中调用 Person()函数。

      这里是在对象o的作用域中调用的,因此调用后 o 就拥有了所有属性和 sayName()方法。

    构造函数的问题

      ...

      ...

  • 相关阅读:
    eval()函数的使用
    Ajax的GET,POST方法传输数据和接收返回数据
    使用目录
    安装目录
    c 文件输入和输出
    【C++王桂林】
    【C++】虚函数表vtable理解
    【C++】内存管理内幕阅读笔记
    git提交中的索引错误问题
    pydicom编辑、删除DICOM文件中病人相关信息
  • 原文地址:https://www.cnblogs.com/lvyongbo/p/4729792.html
Copyright © 2011-2022 走看看