<script type="text/javascript"> function Person(name, age) {this.name = name;this.age = age; } Person.prototype.say = function () {console.log(this.name + " , " + this.age); } function Student(no) {this.no = no; } /*** Student的prototype指向Person的对象*/</span> Student.prototype = new Person(); var stu1 = new Student("0001"); stu1.name = "张三"; stu1.age = "11"; console.log(stu1.no); stu1.say();</script> 输出结果: 
将Student.prototype指向new Person() , new Person的_proto_又指向Person Prototype;这样完成了整个继承。
但是这种方式存在问题:
问题1:当父类存在引用类型变量时,造成数据不一致,下面我们给Person添加一个hobbies属性,类型为数组。
<script type="text/javascript"> /** * 存在问题 * 1、无法在Student的构造方法中传递参数用于父类的构造方法 * 2、对于引用类型变量,造成数据不一致 */ function Person(name, age) {this.name = name;this.age = age;this.hobbies = [] ; } Person.prototype.say = function () {console.log(this.name + " , " + this.age +" , " +this.hobbies); } function Student(no) {this.no = no; } Student.prototype = new Person(); var stu1 = new Student("0001"); stu1.name = "张三"; stu1.age = "11"; stu1.hobbies.push("soccer"); stu1.say(); var stu2 = new Student("0002"); stu2.name = "李四"; stu2.age = "12"; stu2.hobbies.push("girl"); stu2.say();</script> 输出结果:<script type="text/javascript"> function Person(name, age) {this.name = name;this.age = age;this.hobbies = []; } Person.prototype.say = function () {console.log(this.name + " , " + this.age +" , " + this.hobbies); } function Student(name, age, no) {/*** 使用call方法,第一个参数为上下文;* 有点类似Java中的super(name,age)的感觉*/Person.call(this, name, age);this.no = no; } Student.prototype = new Person(); var stu1 = new Student("0001","张三",11); stu1.hobbies.push("soccer"); stu1.say(); var stu2 = new Student("0002","李四",12); stu2.hobbies.push("cangjin"); stu2.hobbies.push("basketball"); stu2.say();</script> 输出:<script type="text/javascript">/** * 基于原型链的集成中都是对象 * 存在问题: * 1、对于引用类型变量,造成数据不一致 */var Person = { name: "人", age: 0, hobbies: [], say: function () {console.log(this.name + " , " + this.age + " , " + this.hobbies); }};var Student = clone(Person);Student.no ="";Student.sayHello = function(){ console.log(this.name +"hello ") ;}var stu1 = clone(Student);stu1.name = "zhangsan";stu1.age = 12;stu1.hobbies.push("Java");stu1.say();var stu2 = clone(Student);stu2.name = "lisi";stu2.age = 13;stu2.hobbies.push("Javascript");stu2.say();/** * 返回一个prototype执行obj的一个对象 * @param obj * @returns {F} */function clone(obj){ var F = function () { }; F.prototype = obj; return new F();} </script> 输出:
对象间通过一个clone函数,不断的返回一个新的对象,且prototype执行传入的对象,整个继承过程其实就是_proto_不断的指向,形成一个链,所以叫做原型链。
好了,已经介绍完了,js的两种集成的方式,最好使用的还是通过类的继承,比较稳定。
以上就是关于继承知识点的相关内容介绍,希望对大家的学习有所帮助。