[译]在JavaScript类中可继承的Static属性(Static Properties in JavaScript Classes with Inheritance)

in #cn6 years ago

原文来自 Static Properties in JavaScript Classes with Inheritance
从ES6开始,JavaScript支持类和类似于其他面向对象编程语言中的static函数。 遗憾的是,JavaScript缺乏对static属性的支持,而Google搜索出来的解决方案无法考虑继承。 我在实现一个需要更强大的static属性概念的Mongoose新功能时遇到了这个问题。 具体来说,我需要通过设置prototype或extends来支持继承的静态属性。 在本文中,我将描述在ES6中实现static属性的模式。

Static方法和继承

假设你有一个简单的带static方法的ES6类:

你能使用extends去创建一个子类,同时仍然可以访问foo()函数:

你能使用static的getter和setter来设置在Base类中的static属性:

遗憾的是,当你有继承了Base的子类时,此操作会有不良的后果。 如果在一个子类上设置foo,它将为Base类和所有其他子类设置foo。

如果你的属性是数组或对象,情况会变得更糟。 由于原型继承,如果foo是一个数组,每个子类都将会有一个引用指向相同的数组副本,如下所示。

所以JavaScript支持静态getter和setter,但是将它们与对象或数组一起使用会是个悲剧。 事实证明,你可以通过JavaScript内置的hasOwnProperty()函数提供一些帮助。

可继承的Static属性

关键点是,由于JavaScript中的类也是一个对象,所以你能区分它的自有属性和继承属性。

这种模式适用于类,但它也适用于ES6之前的JavaScript继承。 这很重要,因为Mongoose仍然使用ES6之前的继承方式。 事后我们知道应该尽早切换,但这个特性是我们第一次看到的去使用ES6类并且继承不仅仅是设置函数的prototype的明显优势。

与老式的Sub.prototype = Object.create(Base.prototype)相比,ES6的类具有一个主要优势,因为extends把静态属性和函数都复制了过来。通过使用Object.hasOwnProperty()进行一点额外的工作,你可以创建正确处理继承的静态getter和setter。 在JavaScript中使用static属性要非常小心:因为在底层,extends仍然使用原型继承。 这意味着static对象和数组在所有子类之间是共享的,除非你使用本文中的hasOwnProperty()模式。

Sort:  

可以了解一下新手村@team-cn。如果有兴趣加我微信ericet

Congratulations @pan-and-pear! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :

You made more than 300 upvotes. Your next target is to reach 400 upvotes.

Click here to view your Board of Honor
If you no longer want to receive notifications, reply to this comment with the word STOP

To support your work, I also upvoted your post!

Do not miss the last post from @steemitboard:

SteemFest3 and SteemitBoard - Meet the Steemians Contest

Support SteemitBoard's project! Vote for its witness and get one more award!