Javascript 面向对象中的组织函数和原型对象

先诠释下原型。每一个Javascript对象(null除外)都和别的一个对象相关联,这个“别的一个对象”就是我们熟知的原型, 每一个对象都从原型继承属性和行动(要领)。

var   a = {}; //原型对象为Object.prototype
var   array = new Array()// 原型对象为Array.prototype
var   myInstance = new MyClass;// 原型对象为MyClass.prototype

在Javascript中,类的一切实例对象都从同一个原型对象上继承属性,下面先看一个例子

function Range是 Range类的组织函数用以初始化新建立的Range类的对象,组织函数并没有建立并返回一个对象,仅仅是初始化,而且在组织函数顶用this设置的属性不是每一个实例同享的,而是独享的,this是对当前对象的运用。

function Range(from, to) {
          if(from)
               this.from = from;//对象的自有属性,在对象中会掩盖从原型那边继承来的from值
          if(to)
               this.to = to; 
}

而一切对象实例都邑继承的属性和行动(要领)都在原型对象里

Range.prototype = {
     includes : function(x) {return this.from <= x && x <= this.to},
     
     foreach : function(f) {
           for(var x = Math.ceil(this.form); x < this.from; x++)  f(x);
    },
    
    toString : function() {return "(" + this.from + "......" + this.to + ")";},
    
    from : 1,

    getBeginning : function() {return this.from}
}
var r = new Range(2, 5);
r.include(3);// true , 3在范围内
r.foreach(alert);//输出2 3 4 5
console.log(r)//
r.getBeginng() // 2 由于在组织函数初始化r的时刻已把属性“from”设置成2了

任何Javascript函数都可以做组织函数,而且用new 关键字挪用组织函数时是要用到一个prototype属性的。因而每一个javascript函数都邑自动具有一个prototype属性。比方

Range.prototype.init = function () {}
nr = new Range.prototype.init();// nr 的属性继承自Range.prototype.init.prototype

原型对象是类的唯一标示,当且仅当两个对象继承自同一个原型对象时,他们才是属于同一个类的实例,而初始化对象的组织函数则不能作为类的标示。 两个组织函数的prototype属性能够指向同一个原型对象,这时候经由过程new挪用两个组织函数建立的实例是属于同一个类的。

上面的例子继承修正

Range.prototype.init.prototype = Range.prototype;//援用通报所以不必忧郁轮回援用;

如许经由过程new Range()和 new Range.prototype.init()建立的对象都是属于Range类的。

console.log((r instanceof Range)); //true
console.log((nr instanceof Range)); //true
    原文作者:KevinYan
    原文地址: https://segmentfault.com/a/1190000002920635
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞