一、基于原型的继承
function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype.hi = function () {
console.log('Hi,my name is'+this.name+",I am "+this.age+"years old now.");
};
Person.prototype.LEGS_NUMS =2;
Person.prototype.ARMS_NUMS = 2;
function Student(name,age,className) {
Person.call(this,name,age);
this.className = className;
}
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;
Student.prototype.hi = function () {
console.log('Hi, my name is'+this.name + "I am" +this.age+"years old now,and from"+this.className);
};
//test
var Lucy = new Student('Lucy',22,'class 4,Grade5');
Lucy.hi();
Lucy.LEGS_NUMS;
需要注意的是,并不是所有函数都有prototype属性,bind()函数就没有。
也并不是所有的对象最终都指向Object.prototype。
var obj2 = Object.create(null);
obj2._proto_ // undefined
obj2.toString // undefined
二、JS原型和JAVA中原型比较
- Java中prototype一旦定义不能轻易改变
- JS中是可以动态去改变prototype属性
Student.prototype.x = 101; Lucy.x; //101 Student.prototype = {y:2}; Lucy.y; // undefined Lucy.x; //101 //改变student.prototype属性不能已经创建的实例,但会影响后续创建的实例。
三、数据类型判断方法instanceof
[1,2]instanceof Array === true;
new Object()instanceof Array === false;
会判断右边的构造器或函数属性会不会出现在左边对象的原型上。
四、实现继承的几种方式
function Person() {
}
function Student() {
}
Student.prototype = Person.prototype; //这种方法不可以,因为子类也会有其他属性需要创建,改
//变子类的同时也会改变父类的属性
//调用构造函数可能传参有问题
Student.prototype = new Person();
//ES5之后支持
Student.prototype = Object.create(Person.prototype);
//
Student.prototype.constructor = Person;