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

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

//方式一:
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';//假设这些车都是红色的

推荐阅读更多精彩内容