面向对象原型链继承知识梳理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象原型链继承知识梳理相关的知识,希望对你有一定的参考价值。

单例模式:就是一个对象咯

var person={
    name:xuwen,
    age:17
};
var person2={
    name:xiaoxu,
    age:25  
}

工厂模式:就是一个函数,解决批量生产问题

 1 function fn(name,age){
 2     var obj={};
 3     obj.name=name,
 4     obj.age=age,
 5     obj.write=function(){
 6         console.log(obj.name);
 7     }
 8     return obj;
 9 }
10 var person1=fn(‘xuwen‘,17);
11 var person2=fn(‘xiaoxu‘,23);
12 person1.write();
13 person2.write();

构造函数:也是一个函数,但这个函数new一下的时候,那么这个函数就会自动产生一个对象(实例),并且最后返回这个对象(实例)。里面的this指的就是当前对象(实例)。方法里面的this例外,谁调用这个方法,this就指向谁。

 1 var name=‘xuxu‘;
 2 function Fn(name,age){
 3     this.name=name;    //this指的就是当前实例
 4     this.age=age;
 5     this.write=function(){
 6         console.log(this.name);  //谁调用方法   this就指向谁
 7     }
 8 }
 9 var person1=new Fn(‘xuwen‘,17);
10 var person2=new Fn(‘xiaoxu‘,23);
11 person1.write();  //xuwen
12 person2.write();  //xiaoxu
13 var p3=person1.write;
14 p3();  //xuxu

上面构造函数有一个弊端,对于属性,每个实例不同,这个没有问题,但是方法对于每个实例都开辟一个空间来存储,那就浪费。毕竟每个方法都是一样,那么怎么解决这个问题呢?那就是下面将的原型了。

基于构造函数的原型及原型链

 1 function Fn(name,age){
 2     this.name=name;    //this指的就是当前实例
 3     this.age=age;
 4 }
 5 Fn.prototype.write=function(){    //这是一个公共的空间  每个实例调用方法直接到这里找就行   牵涉到原型链  那就讲讲吧
 6     console.log(this.name);
 7 }
 8 var person1=new Fn(‘xuwen‘,17);
 9 var person2=new Fn(‘xiaoxu‘,23);
10 person1.write();  //xuwen
11 person2.write();  //xiaoxu
12 
13 //原型链
14 //每个构造函数都有一个prototype属性  这个属性指向(值)存储着   构造函数.prototype 里面的东东
15 //每个对象(实例)都有一个__proto__属性 (顶级Object.prototype这个对象没有这个属性)  这个属性指向(值)  存储着 构造函数.prototype 里面的东东
16 //那么(当然构造函数.prototype也是一个对象,所以构造函数.prototype里面也有一个__proto__属性  那么这个属性最终都指向Object.prototype)
17 //根据这一样一级一级形成了原型链了

整完原型链那么下面就是继承了,这个子级构造函数可以获取到父级构造函数的属性和方法。这里就不细讲了继承诸多继承方法了。就直接用混合继承方法来结束这一章了。

利用  父级.call(this) 来继承父级的属性。

利用一个空函数作中介来继承原型方法

//该函数功能是实现child只继承person上prototype属性或者方法。
function extend(child, person) {
    var F = new Function();
    //当然也可以写成var F=function(){};    都是一样的   定义一个空函数而已
    F.prototype = person.prototype; //把这个空函数的prototype属性指向person原型对象  
    child.prototype = new F(); //child继承空函数的原型属性或者方法   就非常干净的继承了person上的方法或属性了
    child.prototype.constructor = child; //构造器的指向改一下,防止继承链乱序
    child.sub = person.prototype; //自定义一个属性把person的原型属性或方法保存下来。
}

function person() {

}

function child() {
    child.sub.constructor.call(this); //等同于person.call(this);
}

在另外补充一下   instanceof   用法就是   person1 instanceof Fn    判断实例是不是该构造函数下面的   除了父级构造函数   祖先构造函数也会判断true 

hasOwnProperty 用法    person1.hasOwnProperty(‘name‘)    判断  x 属性是否是person1的私有属性    不能判断原型链上    如果要判断原型链上  用  in 关键字

代码就不写了。

那就这样结束吧,明天数组和正则吧!

以上是关于面向对象原型链继承知识梳理的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript面向对象编程高速构建继承关系之整合原型链

JavaScript对象原型链继承闭包

JavaScript对象原型链继承和闭包

面向对象与原型链

js中原型和原型链理解

详解JavaScript中的原型和继承-转自颜海镜大大