HI,大家好!因为之后会提到建构器间的继承,所以在那之前先提一下constructor
这个特性的用途,这个特性在前两篇的[笔记][JavaScript]使用建构器创造实体物件和[笔记][JavaScript]原型(prototype)在JavaScript中的两种意思都有稍微提过,让我们用这一篇文章再来加深一些印象。
一般来说,每个函式都会有一个原型物件function.prototype
,而他的特性constructor
会指向函式自己,以下例子:
//宣告一个空函式function Func(){};//去判断他原型中的constructor特性Func.prototype.constructor; //会回传func本身//拿来和函式本身比较Func === Func.prototype.constructor; //会回传true
好,再来就像之前说的,使用建构器创造出来的实体物件也会有一个constructor
特性,这时候的constructor
也会指向建构器本身,以下例子:
//宣告一个空函式用来当建构器使用function Func(){};//使用该建构器建构一个实体物件var obj = new Func();//来试着判断实体物件中的constructor特性obj.constructor; //会回传func本身//接着直接比较看看obj.constructor === Func; //会回传true
接着我们统整一下上述的观念,在一个建构器Func
中Func.prototype.constructor;
和他建构出来的实体物件的constructor
特性都会指向Func
本身,所以我们可以用一个实体物件来建构出有相同建构器的实体物件,以下例子:
//宣告一个空函式用来当建构器使用function Func(){};//使用该建构器建构一个实体物件var objA = new Func();//经过上面的例子我们可以知道objA.constructor会等于建构器本身Func === objA.constructor; //回传true//使用objA来建立一个拥有相同建构器的实体物件var objB = new objA.constructor();//用instanceof判断是否为建构器Func的实体物件objB instanceof Func; //回传true
另外顺便提一下建构器中的prototype
特性,通常每个函式都会有该特性,而且我们不会去取代这个特性原本有的内容(例如constructor
),而是在该特性中建立新的方法。以下範例:
//宣告一个空函式function Func1(){};//通常是不会去取代他的prototype,就像以下这样Func1.prototype = { writeThis:function(){ console.log(this); },};//为了避免盖掉prototype,所以我们会在原本的prototype中建立方法//宣告一个空函式function Func2(){};//在原本的prototype中新增方法Func2.prototype.writeThis = function(){ console.log(this);};
以上例子的技巧可以使用在必须处理某个建构器的实体,并且想要建立出和某个实体相同的方法来说很方便,更进一步可以把该方法写进建构器的prototype中来使用:
//宣告一个空函式来当建构器使用function Func(){};//在该建构器的prototype建立一个方法特性Func.prototype.copyObj = function(){ return new this.constructor();};//先建构一个实体物件var objA = new Func();//使用该实体物件继承来的copyObj方法来建构第二个有同样建构器的实体物件var objB = objA.copyObj();//最后来判断他是否为建构器Func的实体物件objB instanceof Func; //回传true
以上是对constructor特性的一些说明和应用,如果有说明错误或不明白的地方,麻烦再留言告知我,我会尽速改正!!