• javascript 构造函数,工厂模式,稳妥构造函数浅析


    工厂模式:

    function createPerson(name, age) {
        var o = new Object();           //创建一个要返回的对象
        o.name = name;                  //给该对象设置域
        o.age = age;
        o.sayName = function() {
            alert(this.name);
        }
        return o ;                           //返回该对象
    }
    
    var a = createPerson("hx", 20, "wan");
    a.sayName();

    构造函数模式:

    function Person(name, age) {this.name = name;
        this.age = age;
        this.sayHello = function() {
            alert(this.name + "hello");
        }
    }
    
    var p = new Person("hx", 20);

    对比:

      1.获取对象方式:构造函数模式调用时使用 new 操作符对象,

                   工厂模式获取对象使用接收函数返回值.

      2.类型检测: 使用构造函数生成的对象可以使用 p instanceof Person检测

           工厂模式只能 p instanceof Object

      3.调用者  :构造函数模式的调用者时将要创建的对象,所以

    function Person(name, age) {
        alert (this instanceof Person);
        alert(typeof this)
        this.name = name;
        this.age = age;
        this.sayHello = function() {
            alert(this.name + "hello");
        }
    }
    
    var p = new Person("hx", 20);

                    this instanceof Person为true,

          而在工厂模式中,工厂方法本身就是一个方法,只不过返回值是一个有特定属性的对象,所以其调用者在本例中为Window对象.

    稳妥构造函数模式:

      

    function Person(name, age) {
        var o = new Object();
        this.name = name;
        this.age = age;
        o.sayName = function(){
            alert(name);
        }
        return o;
    }
    
    var p = Person("hx", 20);
    p.sayName();

      我们使用for ... in遍历对象, 在工厂模式和构造函数模式中都可以遍历到name,age属性,和sayName函数对象,但是在这个稳妥构造函数模式中,只能访问到sayName方法,

      我们在定义name和age属性时使用的是this.name,this.age,这个this指代的是window对象

      

    function Person(name, age) {
        var o = new Object();
        this.name = name;
        this.age = age;
        o.sayName = function(){
            alert(name);
        }
        return o;
    }
    
    var p = Person("hx", 20);
    var a;
    for (a in window){
        console.log(a + " : " + window[a])
    }

    在控制台的信息中我们可以看到我们定义的 name:hx,age:20,太长了,不粘贴了.

    我们可以通过alert(name)看到定义的属性.

    所以这种方式创建的对象,感觉就不应该是一个对象,而是多个对象的引用,其name好像引用的是window.name,但是我们修改代码

    function Person(name, age) {
        var o = new Object();
        this.name = name;
        this.age = age;
        o.sayName = function(){
            alert(name);
        }
        return o;
    }
    
    var p = Person("hx", 20);
    window.name = "new";
    p.sayName();
    console.log(window.name);

    可以看到对象p中的sayName依旧是hx,但是window.name为new,为什么呢??

    不知道

  • 相关阅读:
    第19章_枚举:
    第14章_类型信息:
    第13章_字符串:
    纯css背景图自适应
    事务隔离机制_悲观锁_乐观锁
    hibernate 缓存
    list 和 iterate
    hibernate 性能优化之 1+N 问题
    QBC(Query By Criteria) QBE (Query By Example)
    HQL(Hibernate Query Language)
  • 原文地址:https://www.cnblogs.com/slowalker-lee/p/8585638.html
Copyright © 2020-2023  润新知