扫码关注官方订阅号
此处的代码为什么要生成 F这一个空函数作为一个临时中转,不直接使用 Dog.prototype = Animal.prototype呢?
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
你直接把Dog.prototype = Animal.prototype,这时假如我的Dog.prototype与Animal.prototype指向的是同一片内存,那么就意味着一个改变就会影响另外一个,所以采取这种方式,为Dog.prototype重新开辟内存。
Dog.prototype = Animal.prototype
Dog.prototype
Animal.prototype
关于js的继承,实现的方式有几种,最好不要去对应面向对象诸如Java,C#之类的继承(而且,现在很多的前端框架都在弱化继承,因为js是基于原型的)。
我也写过一个js的继承(部分代码):
pm.extend=function(sp,ext){ // if(!utils.isFunction(sp)){ return utils.extend.apply(this,slice.call(arguments,0)); } var F=function(){ //call the constructor F.superclass.constructor.apply(this,slice.call(arguments,0)); }; // F.prototype=new sp(); // utils.extend(F.prototype,ext); // F.prototype.constructor=sp; sp=ext.constructor !=ObjectProto.constructor ? ext.constructor : sp.prototype.constructor; F.superclass=sp.prototype; if(F.prototype.constructor === ObjectProto.constructor){ F.prototype.constructor=F; } return F; };
js的继承会导致出现几个问题,constructor改变,prototype指向出现问题,通过instanceof得不到你想要的继承关系等。
你这里,那个F函数就是为了解决prototype指向的问题的(可以看看相关的书籍,在这里推荐一下月影的《JavaScript王者归来》)
对于js的继承这个东东,建议还是停留在学习,了解上,可以看看一些常见的面向对象的js的设计,比如Extjs(这个用于学习js相关的很有用),Dojo等。
如果父子的 prototype 都指向一个相同的对象,如果子对象的 prototype 的属性被修改,那么就会影响到父对象。所以用一个中介 new F() 来改变这个情况。
直接使用 Dog.prototype = Animal.prototype 这样的话,Dog.prototype更改了,则会引起Animal.prototype更改,这肯定不合你的要求吧?
现在也可以使用Object.create实现继承,dog.prototype=Object.create(animal.prototype)不会造成dog.prototype和animal.prototype指向同一片内存的情况。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
你直接把
Dog.prototype = Animal.prototype,这时假如我的Dog.prototype与Animal.prototype指向的是同一片内存,那么就意味着一个改变就会影响另外一个,所以采取这种方式,为Dog.prototype重新开辟内存。关于js的继承,实现的方式有几种,最好不要去对应面向对象诸如Java,C#之类的继承(而且,现在很多的前端框架都在弱化继承,因为js是基于原型的)。
我也写过一个js的继承(部分代码):
js的继承会导致出现几个问题,constructor改变,prototype指向出现问题,通过instanceof得不到你想要的继承关系等。
你这里,那个F函数就是为了解决prototype指向的问题的(可以看看相关的书籍,在这里推荐一下月影的《JavaScript王者归来》)
对于js的继承这个东东,建议还是停留在学习,了解上,可以看看一些常见的面向对象的js的设计,比如Extjs(这个用于学习js相关的很有用),Dojo等。
如果父子的 prototype 都指向一个相同的对象,如果子对象的 prototype 的属性被修改,那么就会影响到父对象。所以用一个中介 new F() 来改变这个情况。
直接使用 Dog.prototype = Animal.prototype
这样的话,Dog.prototype更改了,则会引起Animal.prototype更改,这肯定不合你的要求吧?
现在也可以使用Object.create实现继承,dog.prototype=Object.create(animal.prototype)不会造成dog.prototype和animal.prototype指向同一片内存的情况。