Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/468.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 修改父prototype.init()函数_Javascript_Oop - Fatal编程技术网

Javascript 修改父prototype.init()函数

Javascript 修改父prototype.init()函数,javascript,oop,Javascript,Oop,我很好奇是否可以修改一个类prototype.init()函数,因为我想扩展一个库,为此我必须在类的初始化中添加一些新变量 我做过这样的原型继承: 函数扩展(){}; Extension.prototype=Toolbar.prototype; Extension.prototype.constructor=扩展 现在我想用扩展中的一些额外变量初始化Parent.prototype.init。 这样做的好方法是什么?此步骤不正确: Extension.prototype = Toolbar.pr

我很好奇是否可以修改一个类prototype.init()函数,因为我想扩展一个库,为此我必须在类的初始化中添加一些新变量

我做过这样的原型继承:

函数扩展(){};
Extension.prototype=Toolbar.prototype;
Extension.prototype.constructor=扩展

现在我想用扩展中的一些额外变量初始化Parent.prototype.init。
这样做的好方法是什么?

此步骤不正确:

Extension.prototype = Toolbar.prototype;
这意味着您的
扩展
不扩展
工具栏
——它实际上共享一个原型,因此您添加到
扩展
的原型中的任何内容也将添加到
工具栏
的原型中。(当然这不是你想要的!)

相反,要:

Extension.prototype = Object.create(Toolbar.prototype);
因此,
扩展
原型是一个全新的对象,它继承了
工具栏
原型的属性。修改此新对象不会对
工具栏产生不必要的上游影响。prototype

要添加原型属性,只需将它们添加到
扩展。原型

Extension.prototype.someExtensionAction = function(someParam) {
    return 100 + this.init(someParam);
}
然后,您可以在
扩展
实例上访问这些属性:

var myExtensionInstance = new Extension();
myExtensionInstance.someExtensionAction(17);

我找到了做我想做的事的方法

现在我知道apply()是如何工作的,这很容易


这是个坏主意:修改其他库提供的对象肯定会导致意外的bug和问题。消费者不希望事物在幕后神奇地改变,考虑他们的类和<代码>扩展< /代码>它们(或者使用你的代码中的传统<代码>对象.CREATE())/>代码>方法,并通过你的库提供。问题是我必须使用香草JS来等待,您想实际修改
工具栏
初始化
,还是希望
扩展
具有调用
工具栏
初始化
(而
扩展
的函数需要额外的参数,但将预期的参数传递到原始的
初始化
)我想要第二个
var parentInit = Parent.prototype.init;

Toolbar.prototype.init = function()
{
    parentInit .apply(this, arguments);
    // Your code here
};