我将以下代码放入babel:
def get_queryset(self):
qs = self.queryset
longitude = self.request.query_params.get('lon', None)
latitude = self.request.query_params.get('lat', None)
if longitude is not None and latitude is not None:
longitude = float(longitude.replace(',', '.'))
latitude = float(latitude.replace(',', '.'))
radius = self.request.query_params.get('radius', 1)
if radius < 0 or radius >= 1:
radius = 1
qs = qs.filter(
address__coordinates__latitude__lte=get_lat_max(longitude, latitude, radius),
address__coordinates__latitude__gte=get_lat_min(longitude, latitude, radius),
address__coordinates__longitude__lte=get_lon_max(longitude, latitude, radius),
address__coordinates__longitude__gte=get_lon_min(longitude, latitude, radius)
)
return qs
并将其转换为以下内容:
class Animal {}
class Rabbit extends Animal {}
问题是为什么它使用此行"use strict";
function _inheritsLoose(subClass, superClass) {
subClass.prototype = Object.create(superClass.prototype);
subClass.prototype.constructor = subClass;
subClass.__proto__ = superClass;
}
var Animal = function Animal() {};
var Rabbit =
/*#__PURE__*/
function(_Animal) {
_inheritsLoose(Rabbit, _Animal);
function Rabbit() {
return _Animal.apply(this, arguments) || this;
}
return Rabbit;
}(Animal);
,并且根据文档subClass.__proto__ = superClass;
可以是object或null,但是这里__proto__
是一个函数。
我的问题不是重复的,因为我不是在问object.prototype = function.prototype,而是为什么用superClass
而不是规范中的__proto__ = typeof function
或object
答案 0 :(得分:2)
用于静态属性/方法。它们也被继承了:
class Animal {
static test() { }
}
console.log(Rabbit.test());
现在要正确地进行编译,Rabbit
构造函数必须继承Animal
构造函数。通常这没有问题,因为功能也是对象,因此可以相互继承。不幸的是,无法创建一个继承另一个函数的函数,该函数必须随后进行设置:
function Animal () { }
Animal.test = function() { }
function Rabbit() { }
Object.setPrototypeOf(Rabbit, Animal);
console.log(Rabbit.test());
现在,下一个问题是Object.setPrototypeOf
和class
一样,是一个很新的东西,因此不能使用它进行向下转换。那就是.__proto__
属性发挥作用的地方:Chrome曾经添加它来更改对象的原型,并且由于许多库都采用了这种用法,其他浏览器也实现了它,因此它也被添加到了规范中,尽管这被认为是设计错误(性能噩梦)。到目前为止,这是唯一可移植静态类属性的可靠方法。
将来,对class
的浏览器支持有望变得更好,并且我们不必再依赖于这些编译黑客了。