1、继承
Person.calll(this,props);
}
调用了Person构造函数不等于继承了Person,Student创建的对象的原型是:
new Student()->Student.prototype->Object.prototype->null
而需要的原型链应该为:
new Student()->Student.prototype->Person.prototype->Object.prototype->null
//定义person构造器
function Person(firstname){
this.firstname=firstname;
}
Person.prototype.walk=function(){
console.log("hi,"+this.firstname);
}
Person.prototype.haha=function(){
console.log("hi,"+this.firstname);
}
function Student(firstname,subject){
//调用父类构造器
Person.call(this,firstname);
//初始化student类特有属性
this.subject=subject;
}
Student.prototype=Object.create(Person.prototype);
Student.prototype.constructor=Student;
Student.prototype.walk=function(){
console.log("hello,"+this.firstname);
}
var student1=new Student("LiMing","math");
student1.walk(); //hello,LiMing
student1.haha(); //hi,LiMing
console.log(student1 instanceof Person); //true
console.log(student1 instanceof Student); //true
在不支持object.create的老javascript引擎中,可以使用一个function来获得相同的返回值
function ctor(){
ctor.prototype=proto;
return new ctor();
}
}
Student.prototype=createobject(Person.prototype);
为什么不能直接用Student.prototype=Person.prototype?
因为如果是这样的话student和person会共享一个原型对象.也可以中间对象用一个空函数F来实现
// 空函数F:
function F() {}
// 把F的原型指向Student.prototype:
F.prototype = Person.prototype;
// 把Student的原型指向一个新的F对象,F对象的原型正好指向Person.prototype:
Student.prototype = new F();
// 把Student原型的构造函数修复为Student:
Student.prototype.constructor = Student;
2、class 对象
class objname{
constructor(param1,param2···){
this.name1=param1;
this.name2=param2;
``````
}
funcname(){
}
}
继承:语法格式类似于c++,记得要使用super来调用父类的构造方法,父类的函数子类可以直接继承
class obj2 extends obj1{
constructor(param1,param2···){
super(param1);
this.name2=param2;
``````
}
funcname(){
}
}