javascript – 为什么我们使用`Boy.prototype = new Human;`来模拟继承?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 为什么我们使用`Boy.prototype = new Human;`来模拟继承?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1300字,纯文字阅读大概需要2分钟。
内容图文
我不明白为什么每个人都在使用Boy.prototype = new Human;模拟继承.看,我们想要的是A的功能吗?我们可以在没有实例化新A的情况下做到这一点(事实上,实例化一个新的A会给我们带来不良结果,因为我们实际上正在运行不是我们想要的实例化函数)
那么这不是一个更好的解决方案吗?
for (var prop_name in Human.prototype) {
Object.defineProperty(
Boy.prototype,
prop_name,
Object.getOwnPropertyDescriptor(Human.prototype,prop_name)
);
}
假设我们是那么特别,并且不仅希望Human.prototype中的可枚举属性,我们仍然可以通过使用Object.getOwnPropertyNames并在原型链上调用它来实现它,而原型链又可以通过Object.getPrototypeOf使用.
那么做Boy.prototype = new Human的好处究竟是什么呢?当我们有更好的选择时,模拟继承?
解决方法:
更好的选择是创建一个中间来保存原型.
function extend(clazz, superclass) {
var intermediate = function() {};
intermediate.prototype = superclass.prototype;
clazz.prototype = new intermediate();
// Following line is optional, but useful
clazz.prototype.constructor = clazz;
}
这避免了不必要的复制,但仍然意味着您不需要实例化将在其构造函数中起作用的对象.它还设置了原型链,以便您可以使用instanceof.它也不会导致超类原型污染,一些遗传反模式可以.
为了完整性,您的子类应该在其构造函数中调用超类构造函数,您可以使用Superclass.call(this);.
编辑:从ES5开始,您可以替换要扩展的调用
Subclass.prototype = Object.create(Superclass.prototype);
它做同样的事情.
内容总结
以上是互联网集市为您收集整理的javascript – 为什么我们使用`Boy.prototype = new Human;`来模拟继承?全部内容,希望文章能够帮你解决javascript – 为什么我们使用`Boy.prototype = new Human;`来模拟继承?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。