标签:javascript 面向对象编程 js
先来看两个现象:
1.分量形式声明prototype(部分重写),prototype的构造器为宿主函数而不是Object,就像直接给宿主构造器增加了属性一样
function Dog(){this.tail = true;}
//新建两条狗,注意此时还没有定义prototype
var benji = new Dog();
var rusty = new Dog();
Dog.prototype.say = function(){return 'Woof!';}
//1.部分重写,prototype的构造器为宿主函数而不是Object,就像直接给宿主构造器增加了属性一样
alert("部分重写,其构造器:"+benji.constructor.prototype.constructor);
//正式因为这个特性,在prototype定义之前创建的对象,仍自动获得了prototype的属性
alert("benji.say()==="+benji.say());//正常,可用也正式因为如此,在prototype声明之前已经创建好的对象,不能使用prototype的属性
——完全重写将原来的实例和prototype切断了
//用完全重写形式
Dog.prototype = {paws: 4,hair: true};
alert("完全重写,其构造器==="+benji.constructor.prototype.constructor);
/*在prototype声明之前已经创建好的对象,不能使用prototype的属性,完全重写将原来的实例和prototype切断了*/
alert("benji.say()==="+benji.say());//正常
alert("用之前对象访问prototype对象的属性::"+benji.paws);//undefined//用完全重写形式
Dog.prototype = {p1: 888,p2: 999};
var lucy = new Dog();//新建对象
for(i in lucy){
alert(i);//tail p1 p2
}
for (i in benji) {
alert(i);//tail say
}另外还有一个问题,会造成困扰,就是完全重写后的构造器指针错误:
Dog.prototype = {p1: 888,p2: 999};
var lucy = new Dog();//新建对象
/*4.完全重写后的构造器指针错误*/
alert(lucy.constructor);//Object?Dog.prototype = {p1: 888,p2: 999};
Dog.prototype.constructor = Dog;
var lucy = new Dog();//新建对象
/*重置构造器指针后,正常了*/
alert(lucy.constructor);具体怎么做,请看下回分解
JavaScript面向对象编程(4)重写prototype造成的混乱
标签:javascript 面向对象编程 js
原文地址:http://blog.csdn.net/zhengwei223/article/details/41785881