对象是有属性和方法组成;
|
当我继承对象的时候,需要继承属性和方法。
|
继承: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继承来的
总结: 一,用构造函数伪装,来继承父级的属性;二,添加子类的属性;三,用原型链来继承父级的方法。