JS对象继承篇ECMAScript只支持实现继承,而且其实现继承主要是依靠原型链来实现的原型链其基本思路是利用原型让一个引用类型继承另一个引用类型的属性和方法function Person(){ this.name = "Person";}Person.pro ...
JS对象继承篇
ECMAScript只支持实现继承,而且其实现继承主要是依靠原型链来实现的
原型链
其基本思路是利用原型让一个引用类型继承另一个引用类型的属性和方法
function Person(){ this.name = "Person";}Person.prototype.getName = function(){ return this.name;};function SuperPerson(name,sex){ this.name = name; this.sex = sex;}SuperPerson.prototype = new Person();//重写原型//在添加新方法或重写原型中的方法时,一定要在重写原型的语句后面,而且不能使用字面量添加新方法,不然又会再一次重写原型,原型链被切断SuperPerson.prototype.getSex = function(){return this.sex;};var Tom = new SuperPerson("Tom","man");console.log(Tom.getName());//Tomconsole.log(Tom.getSex());//man
在上述代码中,先定义了一个Person类型,其中有一个属性和定义在其原型对象上的一个方法,接着定义了一个SuperPerson类型,其中有两个属性,然后重写了它的原型对象,将Person的实例赋值给SuperPerson的原型。然后又在新的原型对象上添加了一个方法。
当然别忘记了默认的原型,因为所有引用类型默认都继承了Object
console.log(Tom instanceof Object);//trueconsole.log(Tom instanceof Person);//trueconsole.log(Tom instanceof SuperPerson);//true
原型链存在的问题:1.包含引用类型的原型属性被所有的实例所共享,我们在继承的时候,原先的实例属性就顺理成章的变成了现在的原型属性,那么后来的其中一个实例中修改值,其他实例都会反映出来 2.在创建子类型的实例时,不能向其父类型的构造函数传递参数。所以综上问题,实践中很少单独使用原型链
借用构造函数
其基本思路是在子类型构造函数的内部调用父类型的构造函数
function Person(name){ this.name = name; this.friends = ["Jack","John","Kim"];}function SuperPerson(name,sex){ //继承Person Person.call(this,name);//call()将Person的运行作用域绑定到了SuperPerson上 //如果要屏蔽父类型中的属性,要在继承语句之后添加 //实例属性 this.sex = sex;}var Tom = new SuperPerson("Tom","man");Tom.friends.push("Amy");console.log(Tom.friends);// ["Jack", "John", "Kim", "Amy"]var David = new SuperPerson("David","man");console.log(David.friends);//["Jack", "John", "Kim"]console.log(David.name);//David
通过调用call()方法(apply()方法也可以),实际上是在将来要新创建SuperPerson的实例上调用了Person构造函数,这样就会在新SuperPerson对象上执行Person构造函数中定义的所有对象初始化代码,结果SuperPerson的每个实例都会具有自己的friends属性的副本这意味着person.friends会被其他对象共享
原标题:JS对象继承篇
关键词:JS
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。