标签: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