js 关于在子类结构函数中加入call(this)的用意

js 关于在子类构造函数中加入call(this)的用意!

先上例子:

function Animal(a,b)
{
	this.a = a;
	this.b = b;
	
}

function Dog(c)
{
	//Animal.call(this);//注释<1>
}

Dog.prototype = new Animal();
Dog.prototype.constructor = Dog;
var dog1 = new Dog('tom');
console.log(dog1);
var animal = new Animal();
console.log(animal);
console.log(dog1 instanceof Animal);

打印结果是:

js 关于在子类结构函数中加入call(this)的用意


此时dog1并没有ab属性,只是他的原型对象上有ab属性,然后我们将注释<1>取消,

打印结果是:

js 关于在子类结构函数中加入call(this)的用意


这个时候,dog1自己就有了ab属性,这个的意思是重写了父类的构造函数上的this上定义的属性和方法,因为可以这样通俗的理解,加入Animal上定义了this.name = ‘哺乳类’

那么其实如果不重写的话,dog1.name='哺乳类',这种类名应该是每个类所所独具有的特色,比如这时候dog.name应是=‘狗’,而不是‘哺乳类’,所以重写父类的this定义的东西,达到即继承了父类的名字的属性,又保留自身的空间(这里指的是属性值的自由)。

---------------------------------------------------------------------------------------------------------------------------------

自我拓展一下:

闲着没事,我想是否可以利用dog1将原型对象顶端上的属性改变呢?也就是改变Animal原型对象上的属性,让所有Animal和他的子类实例的某个属性都改变呢,

所以我加了一行代码:Dog.prototype.__proto__.a = 'd1'; 这个意思是Dog的原型对象是Animal的一个实例。从实例在去找他的__proto__属性找到了Animal的原型对象。然后

改变他的属性a的值,此时打印console.log(animal.a); animal是Animal的实例。发现打印的是underfine,为什么呢?原型对象上是没有a属性的,a属性原本只是存在于Animal的实例上的,我们加的第一行代码是给Animal的原型对象上加了一个a属性,但是其实Animal在实例化的时候会重写重写this.a = a;因为我们new的时候没有加构造参数,所以打印出undefine,为了验证我的推断,我将Animal的a属性去掉:也就是说Animal现在是这样的:

function Animal(b)
{
	this.b = b;
	
}
果然,在执行。就打印出了console.log(animal.a); //d1

纯粹是瞎玩,只是思考,子类可以把父类的东东都改变了,这违反了面向对象继承的思想吧,js的灵活度太大,不知道那些框架类的js是如何处理这种情况的,貌似是复制继承的概念!


版权声明:本文为博主原创文章,未经博主允许不得转载。