<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>对象继承</title> </head> <body> <script> /* function Person(name, age){ this.name = name; this.age = age; this.say = function(){ alert("我的名字是" + this.name); } } function Student(name,id){ this.temp = Person; //临时属性方式,对象冒充 this.temp(name); //delete this.temp; this.id = id; this.showId = function(){ alert('我是学生,我的学号是:' + this.id); } } var stu = new Student('zhangsan','001'); stu.say(); stu.showId(); */ //***************************************************** /*function Person(name, age){ this.name = name; this.age = age; this.say = function(){ alert("我的名字是" + this.name); } } function Student(name,id){ Person.call(this,name);//call方式实现对象冒充 //Person.apply(this,new Array(name)); //apply方式实现冒充 this.id = id; this.showId = function(){ alert('我是学生,我的学号是:' + this.id); } } var stu = new Student('zhangsan','001'); stu.say(); stu.showId(); */ /* 在OO概念中,new实例化后,对象就在堆内存中形成了自己的空间,值得注意的是,这个代码段。而成员方法就是存在这个代码段的,并且方法是共用的。问题就在这里,通过对象冒充方式继承时,所有的成员方法都是指向this的,也就是说new之后,每个实例将都会拥有这个成员方法,并不是共用的,这就造成了大量的内存浪费。并且通过对象冒充的方式,无法继承通过prototype方式定义的变量和方法,如以下代码将会出错:*/ //*************************************** /*function Person(name){ this.name = name; this.say = function(){ alert("我的名字是" + this.name); } } Person.prototype.age = 20; Person.prototype.sayAge = function(){ alert('我的年龄是:' + this.age); } function Student(name,id){ //Person.call(this, age); Person.apply(this, new Array(age)); this.id = id; this.showId = function(){ alert('我是学生,我的学号是:' + this.id); } } var stu = new Student('zhangsan','001'); stu.sayAge(); //报错age 未定义 //stu.showId(); */ //********************************************************* //原型继承方式:此方法实现有缺陷,就是实例化子类时不能把参数传给父类,function Person()没有参数。 /* function Person(){ this.name = 'wangwu'; } Person.prototype.say = function(){ alert('my name is :' + this.name); } function Student(id){ this.id = id; this.showId = function(){ alert('I am a student,my NO is:' + this.id); } } Student.prototype = new Person(); var stu = new Student('001'); stu.say();//zhangsan stu.showId(); alert(stu.hasOwnProperty('id')); */ //******************************************************* //好的继承方式是,成员变量用对象冒充,成员方法用原型继承 function Person(name){ this.name = name; } Person.prototype.say = function(){ alert('my name is :' + this.name); } function Student(name,id){ Person.call(this, name); this.id = id; this.showId = function(){ alert('I am a student,my NO is:' + this.id); } } Student.prototype = new Person('wangwu'); var stu = new Student('zhangsan','001'); stu.say();//zhangsan stu.showId(); alert(stu.hasOwnProperty('id')); </script> </body> </html>