在javascript中扩展Object与不扩展之间有区别吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在javascript中扩展Object与不扩展之间有区别吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1807字,纯文字阅读大概需要3分钟。
内容图文
![在javascript中扩展Object与不扩展之间有区别吗?](/upload/InfoBanner/zyjiaocheng/820/437acd734f764f41aad8dc4cfea8e3d7.jpg)
我发现我可以像这样扩展Object:
class MyObject extends Object {}
这有什么不同,根本没有扩展,像这样:
class MyObject {}
我问这个的原因是因为我有以下mixin:
const MapMixin = (Base = Object) => class extends Base {
static from(array) {
return new this(Object.assign(...array.map(([key, value]) => ({[key]: value}))));
}
map(...args) {
return this.constructor.from(this.entries().map(...args));
}
entries() {
return Object.entries(this);
}
};
这个mixin可以像这样使用:
class MyObject extends MapMixin(MyBaseClass) {}
但是如果没有基类,我现在已经指定它然后将Object扩展为默认值:
class MyObject extends MapMixin() {}
所以我想知道,如果这实际上与没有扩展任何东西相同.
解决方法:
我不知道这里的其他答案是否清楚,但区别在于静态继承.
在class关键字之前,JavaScript中的继承一直非常关注实例继承.没有人(我见过)关心过一个类/构造函数从超类/构造函数继承静态成员的麻烦.更不用说这样做的唯一方法是通过非标准的__proto__属性.
因此,当我们今天查看扩展另一个类的类时,我们会考虑继承如何在该类的实例之间起作用.例如,扩展Object或根本不扩展Object是相同的,因为实例将固有地从Object继承作为基础.
class A {}
class B extends Object {}
let a = new A()
let b = new B()
// a.__proto__.__proto__ === b.__proto__.__proto__ === Object.prototype
但是可能不太清楚,或者很好理解extends关键字不仅仅是为实例设置继承.它还设置了类构造函数之间的继承.因此,对于上面的B,使用extends也意味着在后台为B调用Object.setPrototypeOf(B,Object).例如:
class A {} // A constructor inherits nothing (is a basic Function type)
class B extends Object {} // B inherits from Object
// A.setPrototypeOf === undefined
// B.setPrototypeOf === Object.setPrototypeOf
B,扩展Object,继承Object中的所有静态方法,而A不扩展任何东西,不会.
区别在于B.prototype(或B.prototype .__ proto__) – 继承自哪些实例,以及B .__ proto__-类构造函数继承的内容.是否扩展Object不会影响原型或实例继承的内容,但它确实会影响类的__proto__或静态继承.
内容总结
以上是互联网集市为您收集整理的在javascript中扩展Object与不扩展之间有区别吗?全部内容,希望文章能够帮你解决在javascript中扩展Object与不扩展之间有区别吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。