JavaScript创建对象的五种方法及优缺点

        //一、普通方法
        var hero=new Object(); //创建了一个空的对象
        //属性
        hero.name='黄忠';
        hero.equipment=['头盔','盔甲'];
        hero.attack=function(){
            console.log(this.name+':射箭');
        }
        hero.attack();
        
        //二、工厂方法
        function createHero(name,weapon,equipment,blood){
            var hero=new Object();
            //属性
            hero.name=name;
            hero.weapon=weapon;
            hero.equipment=equipment;
            hero.blood=blood;
            hero.attack=function(){
                console.log(this.name+':攻击');
            }
            console.log(hero);
            return hero;
        }
        var hero1=createHero('黄忠','弓箭',['头盔','鞋子'],100);
        var hero2=createHero('刘备','弓箭',['头盔','鞋子'],100);
        console.log(hero1.name);
        hero2.attack();
        hero1.attack();
        //优点:简化了代码量
        //缺点:1.对象不可细分;2.浪费内存

        //三、自定义构造函数//单词的第一个字母大写
        new Object();
        //new Hero();
        function Hero1(name,weapon,equipment,blood){
            //this 指向当前对象,动态的给对象增加成员
            this.name=name;
            this.weapon=weapon;
            this.equipment=equipment;
            this.blood=blood;
            //缺点:多个对象会在内存创建多个attack方法
            this.attack=function(){
                console.log(this.name+':攻击');
            }
        }
        var hero3=new Hero1('li忠','弓箭',['头盔','鞋子'],100);
        var hero4=new Hero1('刘备','弓箭',['头盔','鞋子'],100);
        console.log(hero1.blood);
        hero3.attack();
        hero4.attack();

        //四、全局变量--解决attack存储多分的方法:将attack方法改为全局变量
        function Hero2(name,weapon,equipment,blood){
            //this 指向当前对象,动态的给对象增加成员
            this.name=name;
            this.weapon=weapon;
            this.equipment=equipment;
            this.blood=blood;
            //缺点:将来在全局变量创建的attack方法多了,方法容易重名,即未来用别的构造函数创建方法时,容易与这个同名
            this.attack=attack
        }
        
        function attack(){
                console.log(this.name+':攻击');
            }
        var hero1=new Hero2('li忠','弓箭',['头盔','鞋子'],100);
        var hero2=new Hero2('刘备','弓箭',['头盔','鞋子'],100);
        console.log(hero1.blood)
        hero1.attack();
        hero2.attack();

        //五、原型对象--解决“将来在全局变量创建的attack方法多了,方法容易重名,即未来用别的构造函数创建方法时,容易与这个同名”的方法:使用原型----每一个构造函数中都有一个属性:原型/原型对象
        function Hero(name,weapon,equipment,blood){
            this.name=name;
            this.weapon=weapon;
            this.equipment=equipment;
            this.blood=blood;
        }
        
        Hero.prototype.attack=function(){
                console.log(this.name+':攻击');
            }
        //通过Hero的构造函数创建的对象,可以访问Hero.prototype中的成员
        var hero1=new Hero('li忠','弓箭',['头盔','鞋子'],100);
        var hero2=new Hero('刘备','弓箭',['头盔','鞋子'],100);
        hero1.attack();
        hero2.attack();
        console.log(hero1.attack()===hero2.attack());  //判断hero1中的attack方法与hero2中的attack方法在内存中是否占得同一块空间
       
        console.dir(hero2); //查看对象的内容
        //由原型链可知,当调用对象的属性或方法的时候,先去找对象本身的属性或方法,如果对象没有该属性或者方法,此时去找该构造函数的原型中是否有此属性或方法,
        //如果没有该属性,则去找Object原型对象中是否存在,如果没有,则去null中去查找,如果还是没有,会报错
        //hero1.__proto__ : 对象的__proto__等于构造函数Student.prototype
        //__proto__属性是非标准属性。作用:作为对象的属性去指向构造函数的prototype,以此来让对象可以访问原型中的成员或方法

        //在原型中有一个属性 constructor 构造函数
        //constructor 作用: 记录了创建该对象的构造函数
        console.log(hero2.constructor);

        var arr=[];  //数组本身也是一个对象,对象就有constructor属性
        console.log(arr.constructor); //可以看出数组的默认构造函数是Array

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值