先上例子:
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是如何处理这种情况的,貌似是复制继承的概念!
版权声明:本文为博主原创文章,未经博主允许不得转载。