为什么__proto__不是对象

时间:2019-04-22 13:55:48

标签: javascript ecmascript-6 prototype babel

我将以下代码放入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 functionobject

1 个答案:

答案 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.setPrototypeOfclass一样,是一个很新的东西,因此不能使用它进行向下转换。那就是.__proto__属性发挥作用的地方:Chrome曾经添加它来更改对象的原型,并且由于许多库都采用了这种用法,其他浏览器也实现了它,因此它也被添加到了规范中,尽管这被认为是设计错误(性能噩梦)。到目前为止,这是唯一可移植静态类属性的可靠方法。

将来,对class的浏览器支持有望变得更好,并且我们不必再依赖于这些编译黑客了。