美文网首页
JS的面向对象的编程思想1-阮一峰

JS的面向对象的编程思想1-阮一峰

作者: 人才辈出阿卡姆 | 来源:发表于2017-07-08 11:45 被阅读0次

    在传统的思维模式上定义个一对象

    //方式一:
    var obj={};
    obj.name="小明";
    obj.age=20;
    console.log(obj)
    //方式二:
    var obj1={
        name:"隔壁小王",
        age:16
    }
    console.log(obj1);
    

    从上面来看:这两个obj的输出结构上是一样的一个name,一个age 但当需要构建N多个这种数据结构的时候,就不方便我们进行操作,程序员的主要思想表现是什么,就是懒——能让计算机自己完成的事情,就不要重复的去操作。

    //这个时候我们创建一个函数,让他来实现相似的功能
    function Obj(name,age){
        var obj= {};
        obj.name=name;
        obj.age=age;
        return obj;    //这里必须要将obj这个结果返回,如果没有返回的话,你在外部看不到这个信息
    }
    
    function Cat(name,color) {
        return {
            name:name,
            color:color
        }
    }
    
    //上面这两个例子在实质上都是一样的,都是在函数内部通过创建一个对象,在对象的属性上进行设置,最后将这个对象进行返回
    
    var obj2=Obj('xiaohong',20);
    var obj3=Obj('damao',30);
    console.log(obj2)
    console.log(obj3)
    console.log(obj3.constructor)
    var mao=Cat('mao','red');
    var gou=Cat('gou','black');
    console.log(mao.constructor);
    

    但是有一个问题,阮一峰上面说这两个实例内在没什么联系,不能反映出他们是同一个原型上的实例,不明白他这句话的意思???
    下面使用构造函数方式进行创建,构造函数的本质就是一个函数,只不过它使用了new来创建实例。并且构造函数的内部使用this来表示它的上下问环境和调用者
    //作为函数调用的话,它的上下文环境就是global;作为对象的属性方法来调用的话,就是指他的父级=这个对象;作为构造函数来使用,this指的就是这个构造函数创建的实例;apply,call来使用的话,this指的就是它的第一个参数,就是让谁来借用这个方法,直白一点 银行.money.call(我) 我借银行的钱

    //    new关键字的作用
    //    创建一个空对象。
    //    设置这个对象的原型,就是指定__proto__的指向
    //    将构造函数的作用域赋给新对象(因此this就指向了新对象)
    //    执行构造函数中的代码(给这个新对象添加方法和属性)
    //    返回这个对象(this)
    
    //我在这里就认为 构造函数是new和this配合使用的函数
    function Car(name,price){
        this.name=name;
        this.price=price;
    }
    var BMW=new Car('宝马E90',150000);
    var Audi=new Car('audiA8',350000);
    console.log(BMW);
    console.log(Audi);
    console.log(BMW.constructor)
    

    好了,到了这里,我发现刚才留下疑问的答案了:没有通过构造函数进行创建的实例=》function Object() { [native code] },而通过构造函数创建的实例,他们都指向=》function Car(name,price){ }

    这个时候阮一峰引入了另一个问题:我们虽然通过构造函数进行统一的属性和内容,但是我在创建实例的时候如果有的属性和方法并不是我想要的,就会内存的消耗。能不能有一种方法是,我只要你这个外壳,里面的内容我自己来添加。我用的时候添加,不用的话你就保持原有的状态。不消耗内存空间。
    这里指的意思是在每次创建实例的时候,其实都开辟了一个新的内存空间,但是里面东西是重复的。现在我们要把相同内容抽离出来,节省出来这一部分空间 引入了prototype的概念

    //Car.prototype.color='red';//假设这些车都是红色的

    相关文章

      网友评论

          本文标题:JS的面向对象的编程思想1-阮一峰

          本文链接:https://www.haomeiwen.com/subject/fsidhxtx.html