继承是什么?
- 课本的介绍:子类可以继承父类的方法和属性,然后在这个基础上进行添加方法和属性。可以提高代码的复用性和效率。
- 我的理解:继承就是可以少些很多代码。我们可以把之前的实现的方法和属性,拿过来然后给新的对象用。
- 遗憾的是,js并没有天生的继承机制。所以要我们自己来实现。怎么实现?请往下看。
- 前面的文章讲解了一些基础知识。建议看看。:)
怎么创建的对象详细介绍
废话说多了不好,直接看例子
function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype.run = function(){
console.log("I can run!!");
}
var p1= new Person('zhaobw',23);
p1.run();
先在我们已经有一个构造函数Person了。这个构造函数还有个方法run()
现在我们需要创建个新的构造函数Student。这个构造函数有属性name、age方法run().还有一个新的属性ID。我们该怎么写?
function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype.run = function(){
console.log("I can run!!");
}
var p1= new Person('zhaobw',23);
p1.run();
function Student(name,age,id){
this.name = name;
this.age = age;
this.id = id;
}
Person.prototype.run = function(){
console.log("I can run!!");
}
var p1= new Person('zhaobw',23,20134540);
p1.run();
对比一下student和Person。两个函数只有一点点的不同。但是却写了好多的代码。是不是很浪费。
现在我们用继承来实现。
function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype.run = function(){
console.log("I can run!!");
}
function Student(name,age,id){
Person.call(this,name,age);
this.id = id;
}
Student.prototype = copy(Person.prototype);
function copy(oldObj){
var obj = new Object();
obj.__proto__ = oldObj;
return obj;
};
var s1 = new Student('z','23',12);
s1.run();//I can run!!
结果证明Student继承了Person
其他的写法:
1
function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype.run = function(){
console.log("I can run!!");
}
function Student(name,age,id){
Person.call(this,name,age);
this.id = id;
}
Student.prototype = Object.create(Person.prototype);//这里发生了变化
var s1 = new Student('z','23',12);
s1.run();//I can run!!
2
function Person(name,age){
this.name = name;
this.age = age;
}
Person.prototype.run = function(){
console.log("I can run!!");
}
function Student(name,age,id){
Person.call(this,name,age);
this.id = id;
}
Student.prototype = copy(Person.prototype);
function copy(oldObj){
var newObj = function(){};
newObj.prototype = oldObj;
return new newObj();
}
var s1 = new Student('z','23',12);
s1.run();
写了这么多了。发现了规律了么?
- 首先通过call来获得父类的属性。
- 创建一个空对象,然后这个空对象的proto指向父类的prototype。
- 子类的prototype的指向上面创建的空对象。
前面说了一堆的废话。然后写了一堆代码。总结出来了上面的三句话。好好的理解。
知识拓展
为了更好的理解继承,我多写一点点额外的拓展。
-
instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。这个方法可以用来检测对象的父类是谁。
当然我们也可以自己封装实现:function _instanceof(obj,fn){ var sign = obj.__proto__; while(sign){ if(sign == fn.prototype){ return true; }else{ sign = sign.__proto__; } } return false; }
- hasOwnProperty是Object.prototype的一个方法
判断一个对象是否包含自定义属性和方法,而不是原型链上的属性和方法