• javascript继承(二)—创建对象的三种模式


    一、工厂模式
    function createPerson(name,age){
        var o = {};
        o.name = name;
        o.age = age;
        o.sayHi = function(){
            alert('my name is' + this.name);
        };
        return o;
    }
    var p1 = createPerson('小明',10);
    var p2 = createPerson('小红',9);
    p1.sayHi();
    p2.sayHi();
    console.log(p1.constructor); //Object
    console.log(p2.constructor); //Object
     
    工厂模式可以创建多个对象,但是并不知道对象的类型,因为都指向了Object
    二、构造函数模式
    function Person(name,age){
        this.name = name;
        this.age = age;
        this.sayHi = function(){
            alert('my name is' + this.name);
        }; 
    }
    var p1 = new Person('小明',10);
    var p2 = new Person('小红',9); 
    p1.sayHi();
    p2.sayHi();
    console.log(p1.constructor); //Person(name,age)
    console.log(p2.constructor); //Person(name,age)
    console.log(p1.sayHi==p2.sayHi);//false

    p1的sayHi方法和p2的sayHi方法是不同的,说明每new一个对象就会创建一个sayHi方法,其实这完全没必要,也会浪费空间。

    当然代码可以改写如下:
    function Person(name,age){
        this.name = name;
        this.age = age;
        this.sayHi = sayHi;
    }
    function sayHi(){
    alert('my name is' + this.name);
    }
    var p1 = new Person('小明',10);
    var p2 = new Person('小红',9);
    p1.sayHi();
    p2.sayHi();
    console.log(p1.constructor); //Person(name,age)
    console.log(p2.constructor); //Person(name,age)
    console.log(p1.sayHi==p2.sayHi);//true

    这时它们方法所指向的代码块就相同,即共用了一个方法。但其实没有必要为了一个类的特权方法就创建一个全局的方法,也会使得这个类显得比较凌乱。

    第三、原型链模式
    function Person(name,age){
        this.name = name;
        this.age = age;
    }
    Person.prototype.sayHi =function(){
        alert('my name is' + this.name);
    }
    var p1 = new Person('小明',10);
    var p2 = new Person('小红',9);
    p1.sayHi();
    p2.sayHi();
    console.log(p1.constructor); //Person(name,age)
    console.log(p2.constructor); //Person(name,age)
    console.log(p1.sayHi==p2.sayHi);//true

    对于原型链来创建对象,可以看到对象引用的方法是同一个方法,即类的共有方法。这样极大的节约了代码空间,不会每new一个对象就就类的所有方法创建一遍。

    对于对象的特权属性、方法和共有属性、方法在javascript中类的属性研究 这篇文章中有所介绍。

  • 相关阅读:
    MyBatis的缓存
    16年随笔
    linux 随笔
    Linux下启动Tomcat启动并显示控制台日志信息
    linux 连接工具
    Linux Tomcat重新启动
    SpringMVC 文件上传 MultipartFile
    spring @component
    mysql转型
    MyBatis传入参数
  • 原文地址:https://www.cnblogs.com/lj915/p/3780407.html
Copyright © 2020-2023  润新知