JavaScript prototype

JavaScript prototype

每一个函数都有一个prototype属性,这个属性是指向一个对象的援用,这个对象称为原型对象,原型对象包括函数实例同享的要领和属性,也就是说将函数用作组织函数挪用(运用new操作符挪用)的时刻,新创建的对象会从原型对象上继续属性和要领。

私有变量、函数

在详细说prototype前说几个相干的东东,能够更好的明白prototype的设想企图。之前写的一篇JavaScript 定名空间博客提到过JavaScript的函数作用域,在函数内定义的变量和函数假如不对外供应接口,那末外部将无法接见到,也就是变成私有变量和私有函数。

function Obj(){
    var a=0; //私有变量
    var fn=function(){ //私有函数
        
    }
}

如许在函数对象Obj外部无法接见变量a和函数fn,它们就变成私有的,只能在Obj内部运用,即使是函数Obj的实例依然无法接见这些变量和函数

var o=new Obj();
console.log(o.a); //undefined
console.log(o.fn); //undefined

静态变量、函数

当定义一个函数后经由过程 “.”为其增加的属性和函数,经由过程对象自身依然能够接见获得,然则其实例却接见不到,如许的变量和函数离别被称为静态变量和静态函数,用过Java、C#的同砚很好明白静态的寄义。

function Obj(){
    
}

Obj.a=0; //静态变量

Obj.fn=function(){ //静态函数
        
}

console.log(Obj.a); //0
console.log(typeof Obj.fn); //function

var o=new Obj();
console.log(o.a); //undefined
console.log(typeof o.fn); //undefined

实例变量、函数

在面向对象编程中除了一些库函数我们照样愿望在对象定义的时刻同时定义一些属性和要领,实例化后能够接见,JavaScript也能做到如许

function Obj(){
    this.a=[]; //实例变量
    this.fn=function(){ //实例要领
        
    }
}

console.log(typeof Obj.a); //undefined
console.log(typeof Obj.fn); //undefined

var o=new Obj();
console.log(typeof o.a); //object
console.log(typeof o.fn); //function

如许能够到达上述目标,但是

function Obj(){
    this.a=[]; //实例变量
    this.fn=function(){ //实例要领
        
    }
}

var o1=new Obj();
o1.a.push(1);
o1.fn={};
console.log(o1.a); //[1]
console.log(typeof o1.fn); //object
var o2=new Obj();
console.log(o2.a); //[]
console.log(typeof o2.fn); //function

上面的代码运转效果完整符合预期,但同时也申明一个题目,在o1中修改了a和fn,而在o2中没有转变,由于数组和函数都是对象,是援用范例,这就申明o1中的属性和要领与o2中的属性与要领虽然同名但却不是一个援用,而是对Obj对象定义的属性和要领的一个复制。

这个对属性来讲没有什么题目,然则关于要领来讲题目就很大了,由于要领都是在做完整一样的功用,然则却又两份复制,假如一个函数对象有上千和实例要领,那末它的每一个实例都要坚持一份上千个要领的复制,这显然是不科学的,这可肿么办呢,prototype应运而生。

    原文作者:木头人
    原文地址: https://segmentfault.com/a/1190000004021593
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞