【发布时间】:2013-07-25 20:32:23
【问题描述】:
我想复制一个可调用类的实例化而不使用模块模式。
以下是我对此的最佳尝试。但是,它使用我不确定的__proto__。这可以在没有__proto__ 的情况下完成吗?
function classcallable(cls) {
/*
* Replicate the __call__ magic method of python and let class instances
* be callable.
*/
var new_cls = function () {
var obj = Object.create(cls.prototype);
// create callable
// we use func.__call__ because call might be defined in
// init which hasn't been called yet.
var func = function () {
return func.__call__.apply(func, arguments);
};
func.__proto__ = obj;
// apply init late so it is bound to func and not cls
cls.apply(func, arguments);
return func;
}
new_cls.prototype = cls.prototype;
return new_cls
}
【问题讨论】:
-
利用原型继承有什么问题?这只是多态性的另一种方案。
-
它实际上是跨浏览器的(虽然 IE 和 [旧版本?] Opera 似乎不支持它),and is in the ECMAScript ed6 spec. draft,所以在某些时候它将是标准的(除非他们将来将其从规范中删除)。不过,您说得对,目前它还不是标准的。
-
您避免使用模块模式的动机是什么?看到 Javascript 显然没有真正的可调用对象,并且与 Python 相比,似乎以相反的方式继续语言设计的这一方面
-
注意
.__proto__和.constructor.prototype一样 -
@SimonBoudrias 仅在获取
.__proto__时,而不是在设置时。事后设置构造函数的原型对已创建的对象没有影响,要更改已创建对象使用的原型,您必须直接设置它们。虽然您可能会删除.constructor.prototype中的所有属性,然后添加新属性,但这意味着原型属性的更改将影响该构造函数创建的所有对象,而不仅仅是给定函数(当然,这可能是可取的,但可能不是这种情况)。
标签: javascript prototype-programming