来源:转载 发布时间:2018-08-13 11:38:10 阅读量:2105
本篇文章给大家带来的内容是关于js的继承方式有哪些?js实现继承的几种方式介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
1、js实现继承的方式:原型链
实现方法:A原型的实例是B原型的属性
不要忘记原型链中默认存在Object
子类添加方法或重写超类方法要放在替换原型语句之后
通过原型链实现继承后,不能使用对象字面量的方式创建方法和属性,因为会重写原型链
通过原型链实现继承后,超类的引用类型属性会被所有实例共享
function SuperType() { this.property = true; this.arr=[1,2,3]}SuperType.prototype.getSuperValue = function() { return this.property;}function SubType() { this.sub = false;}SubType.prototype = new SuperType();//继承SuperType,即以superType的实例为中介,使subType。prototype指向superType的原型SubType.prototype.getSubValue = function() { //添加新方法 return this.sub;}SubType.prototype.getSuperValue = function() { // 重写超类中的方法 return this.sub;}var instance1 = new SubType();instance1.arr.push(4);console.log(instance1.arr); //1,2,3,4var instance2 = new SubType();console.log(instance2.arr); //1,2,3,42、js实现继承的方式:借用构造函数
实现方法:在子类的构造函数内调用超类构造函数,即使用call()或者apply(),使得超类构造函数作用域发生改变
可以给构造函数传递参数,但无法进行函数复用
function SuperType(name,age){ this.name = name; this.age = age;}function SubType() { SuperType.call(this,'i','21')//继承SuperType,并传递参数 this.job = 'actor'}3、js实现继承的方式:组合继承
实现方法:使用原型链实现对原型属性和方法的继承,借用构造函数实现对实例属性的继承
隐患:调用两次父类构造函数(1call()方法,2new SuperType() )
function SuperType(name,age){ this.name = name; this.age = age; this.f = [1,2,3,4]}SuperType.prototype.sayName = function() { console.log(this.name)}function SubType(name,age) { SuperType.call(this,name,age)//继承SuperType,并传递参数 this.job = 'actor'}SubType.prototype=new SuperType();SubType.prototype.constructor = SubType;SubType.prototype.sayHello=function() { console.log('hello')}var h = new SubType('hua', 18);h.sayName()//hahah.f.push(5)console.log(h.f)//1,2,3,4,5var n = new SubType();console.log(n.f)//1,2,3,44、js实现继承的方式:原型式继承
以一个对象为基础,生成新对象,再对新对象进行修改
超类引用类型的属性依然是共享的
var person = { name:'lily', age:'21', friends:[1,2,3]}var people = Object.create(person);people.friends.push(4);var human = Object.create(person);console.log(human.friends)//1,2,3,45、js实现继承的方式:寄生式继承
创建一个仅用来实现继承过程的函数,并在函数内部扩展对象,再将对象返回
此时父类的引用类型属性依然是被所有实例共享
function anotherFunction(original) { var clone = Object(original); clone.sayHi = function() { console.log('hi') } return clone;}var person = { name:'lili', age:'21', f: [1,2,3]}var people1 = anotherFunction(person);people1.f.push(4)console.log(people1.f);// 1,2,3,4var people2 = anotherFunction(person);console.log(people2.f);// 1,2,3,46、js实现继承的方式:寄生组合式继承
通过借用构造函数来继承属性,通过原型链混成来继承方法
减少了一次父类构造函数的执行,父类引用类型的属性不被共享
function SuperType(name,age){ this.name = name; this.age = age; this.f = [1,2,3,4]}SuperType.prototype.sayName = function() { console.log(this.name)}function SubType(name,age) { SuperType.call(this,name,age) this.job = 'actor'}function inherit(superType,subType) { var property = Object.create(superType.property);// 创建父类原型的一个副本,并没有调用父类构造函数 property.constructor = subType;// 使父类原型副本的constructor属性指向子类 subType.property = property;// 子类的原型指向父类原型副本}inherit(SuperType,SubType)var instance = new SubType('haha', 18);instance.sayName()//hahainstance.f.push(5);console.log(instance.f);//1,2,3,4,5var ins = new SubType();console.log(ins.f);//1,2,3,4相关推荐:
JS继承--原型链继承和类式继承_基础知识
JS中的继承方式实例详解
JS实现继承的几种方式
以上就是js的继承方式有哪些?js实现继承的几种方式介绍的详细内容,更多请关注php中文网其它相关文章!