js之创建对象(摘自高程)

工厂模式

function factorial(name,age){
        var o=new Object();
        o.name=name;
        o.age=age;
        o.sayName= function () {
            alert(this.name);
        };
        return o;
    }
    var result=factorial("lily",25);
    result.sayName();

 

缺点:没有解决对象识别问题,即无法知道对象的类型

构造函数模式
 
 function Person(name,age){
        this.name=name;
        this.age=age;
        this.sayName=function(){
            alert(this.name);
            alert(this.age);
        }
    }
    var obj=new Person("lily",30);

 


优点:没有显式的创建对象;
        直接将属性和方法赋给了this对象;
        没有return语句;
缺点:每个方法都要在每个实例上重新创建一遍

原型模式
缺点:原型中所有属性是被很多实例共享的,这种共享对于函数非常合适。对于那些包含基本值的属性倒也说得过去,毕竟,通过在实力上添加一个同名的属性,可以隐藏原型中的对应属性,但对于包含引用类型值得属性来说,问题就比较突出了,如下代码所示:
 
    function Person(){
    }
    Person.prototype.name="lily";
    Person.prototype.age="25";
    Person.prototype.sayName=function(){
        alert(this.name);
        alert(this.age);
    };
    Person.prototype.friend=["lucy","fang"];
    var newObj=new Person();
    newObj.friend.push("newFriend");
    var newObj02=new Person();
    alert(newObj02.friend);
混合模型
 
    function MixedFunction(name,age){
        this.name=name;
        this.age=age;
    }
    MixedFunction.prototype.sayName=function(){
        alert(this.name);
        alert(this.age);
    };
    var mixObj=new MixedFunction("lily",25);
    mixObj.sayName();

 


动态原型模式
就是通过检查某个应该存在的方法是否有效,来决定是否需要初始化原型
 
    function DynamicFunction(name,age){
        this.name=name;
        this.age=age;
        if(typeof this.sayName!="function"){
            DynamicFunction.prototype.sayName=function(){
                alert(this.name);
                alert(this.age);
            }
        }
    }

    var obj=new DynamicFunction("liy",25);
    obj.sayName();

 


寄生构造模式(除了使用new操作符并把使用的包装函数之外,这个模式跟工作模式其实一样)
该函数的作用仅仅是封装创建对象的代码,然后再返回新创建的对象
    function Person(name,age){
        var o=new Object();
        o.name=name;
        o.age=age;
        o.sayName=function(){
            alert(o.name);
        };
        return o;
    }
    var friend=new Person("lily",25);
    friend.sayName();

 


稳妥构造函数

这种方式适合用在不允许引用this的对象,稳妥对象最适合在一些安全的环境中(这些环境中会禁止使用this和new),或者在防止数据被其他应用程序(如Mashup)改动时使用
    function Person(name,age){
        var o=new Object();
        o.sayName=function(){
            alert(name);
        };
        return o;
    }
    var friend=new Person("lily",25);
    friend.sayName();
该函数中的name只允许调用sayName()方法外,没有别的方式可以访问其name值



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。