继承

对象是有属性和方法组成;
|
当我继承对象的时候,需要继承属性和方法。
|
继承:1,先执行父级的构造函数;2、添加子类的属性;3,添加方法
    function Person(name,sex) {
        this.name = name;
        this.sex = sex;
    }
    //    通过原型加方法;
    Person.prototype.showName = function () {
        console.log(this.name);
    }
    Person.prototype.showSex = function () {
        console.log(this.sex);
    }
    var a = new Person("wang","22");
    a.showName();
    a.showSex();
//    在此基础上继承worker
    function Worker(name,sex,job) {
        Person.call(this,name,sex);//构造函数伪装,调用父级的构造函数(就是为了继承属性)。这里的this是new出来的worker对象
        this.job = job;//添加子类的属性
    }
    Worker.prototype = Person.prototype;//原型链,引用,通过原型来继承父级的方法。
    Worker.prototype.showJob = function () {
        console.log(this.job);
    }
    var b = new Worker("li","女","扫地的");
    b.showName();
    b.showSex();
    b.showJob();
    console.log(Person.prototype.showJob);//子类影响了父类的东西

出现的问题,子类影响了父类的东西,这里就说到了引用。ex:

引用:钥匙,同一块区域的地址
记住,js里面所有的对象全是引用。
    var arr1 = [1,2,3];
    var arr2 = arr1;//配钥匙
    arr2.push(4);
    console.log(arr2);//1234
    console.log(arr1);//1234
//如果我不希望是一个引用,我希望我修改arr2的时候,arr1不受影响,怎么做呢?ex:
    var arr1 = [1,2,3];
    var arr2 = [];
    for(var i in arr1){//把arr1里的东西复制一份到arr2中。
        arr2[i]=arr1[i];
    }
    arr2.push(4);
    console.log(arr2);//1234
    console.log(arr1);//123

.call():调用一个对象的一个方法,以另一个对象替换当前对象.
Person.call(this,name,sex);//构造函数伪装,调用父级的构造函数(就是为了继承属性)。这里的this是new出来的worker对象

最终,继承代码改为:
    function Person(name,sex) {
        this.name = name;
        this.sex = sex;
    }
    //    通过原型加方法;
    Person.prototype.showName = function () {
        console.log(this.name);
    }
    Person.prototype.showSex = function () {
        console.log(this.sex);
    }
    var a = new Person("wang","22");
    a.showName();
    a.showSex();
    //    在此基础上继承worker
    function Worker(name,sex,job) {
        Person.call(this,name,sex);//用构造函数伪装,来继承父级的属性
        this.job = job;//添加子类的属性
    }

    for(var i in Person.prototype){
        Worker.prototype[i]=Person.prototype[i];//用原型链来继承父级的方法
    }

    Worker.prototype.showJob = function () {
        console.log(this.job);
    }
    var b = new Worker("li","女","扫地的");
    b.showName();
    b.showSex();
    b.showJob();
    console.log(Person.prototype.showJob);//undefind

其中

for(var i in Person.prototype){Worker.prototype[i]=Person.prototype[i];//用原型链来继承父级的方法}

是复制了一份Person的方法到worker中。

补充:instanceof

instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。

type of  :....的类型

var arr1 = new Array()
Array叫类,arr1叫实例。
instance :实例,就是new出来的东西 ,是arr1
所以,instance of :...的实例 作用:判断某个对象是否是某个类的实例
    var arr1 = [1,2,3];
    console.log(arr1 instanceof Array);//true
    console.log(arr1 instanceof Object);//true 所有的类都是Object的一个子类,从object继承来的

 


 

总结: 一,用构造函数伪装,来继承父级的属性;二,添加子类的属性;三,用原型链来继承父级的方法。

posted @ 2016-11-10 18:15  最爱小虾  阅读(162)  评论(0编辑  收藏  举报