码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2015-08-07 11:16:34      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

先上例子:

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);

打印结果是:

技术分享


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

打印结果是:

技术分享


这个时候,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是如何处理这种情况的,貌似是复制继承的概念!


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

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

标签:

原文地址:http://blog.csdn.net/wjy397/article/details/47334147

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!