原型继承
实例对象中只有属性,没有定义
hasOwnProperty
、toString
方法,但依然可以调用,继承自Object
原型
let obj = {name: '小强'}
obj.hasOwnProperty('name') // true
混入继承
对象的属性、方法,添加到另一个对象中(自己写extend)
var obj2={
name:'lilei',
sayHello:function(){
console.log('我是'+this.name);
}
};
var obj3={
age:18,
sayHello1:function(){
console.log('我是'+this.name+'今年'+this.age);
}
};
var obj1={
extend:function(){
//arguments为函数中默认的对象,里面存储着所有的函数传入参数。
for(var i=0; i< arguments.length;i++){
for(var k in arguments[i]){
this[k]=arguments[i][k];
}
}
}
};
obj1.extend(obj2,obj3);//将obj2和obj3混入到obj1中
obj1.sayHello();//
obj1.sayHello1();
混合继承
- 被继承对象
- 继承对象、继承方法
3.1. 实例继承
3.2. 原型继承
// 被继承的方法
var Person={
sayHello:function(){
console.log('我是'+this.name+'今年'+this.age);
}
}
// 接受继承的构造函数
function Student(name,age){
this.name=name;
this.age=age;
}
// 构造函数的继承方法
Student.prototype.extend=function(obj){
for(var k in obj){
this[k]=obj[k];
}
}
// 继承方法1. 所有实例继承
Student.prototype.extend(Person);
var s1=new Student('lilei',18);
// 继承方法2. 实例s1继承
s1.extend(Person);
上下文调用继承
通过改变
this
指向
var Person={
sayHello:function(){
console.log('我是'+this.name+'今年'+this.age);
}
}
function Student(name,age){//student构造函数
this.name=name;
this.age=age;
}
var s1=new Student('lilei',18);
Person.sayHello.call(s1);
Object.create(Propertype)
创建一个空对象,对象的原型指向
Propertype
const Prop= {
toString: function () {
return this.name + this.age
}
}
const obj = Object.create(Prop)
obj.name = '小兰'
obj.age = 18