Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/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中重写被调用函数_Javascript - Fatal编程技术网

如何在javascript中重写被调用函数

如何在javascript中重写被调用函数,javascript,Javascript,我试过了,但没有成功: 网页设计 函数MyClass(){ 函数someFunc(){calledFunc();} 函数calledFunc(){document.writeln('orig called');} 返回{ someFunc:someFunc, calledFunc:calledFunc } } var obj=新的MyClass(); obj.someFunc(); obj.calledFunc=function(){document.writeln(“未调用原始文件”);}

我试过了,但没有成功:


网页设计
函数MyClass(){
函数someFunc(){calledFunc();}
函数calledFunc(){document.writeln('orig called');}
返回{
someFunc:someFunc,
calledFunc:calledFunc
}
}
var obj=新的MyClass();
obj.someFunc();
obj.calledFunc=function(){document.writeln(“未调用原始文件”);}
obj.someFunc();

您必须在调用
calledFunc
方法时预先添加
此项。
,否则您将引用私有
函数calledFunc()


网页设计
函数MyClass(){
函数someFunc(){this.calledFunc();}
函数calledFunc(){document.writeln('orig called');}
返回{
someFunc:someFunc,
calledFunc:calledFunc
}
}
var obj=新的MyClass();
obj.someFunc();
obj.calledFunc=function(){document.writeln(“未调用原始文件”);}
obj.someFunc();

您必须在调用
calledFunc
方法时预先添加
此项。
,否则您将引用私有
函数calledFunc()


网页设计
函数MyClass(){
函数someFunc(){this.calledFunc();}
函数calledFunc(){document.writeln('orig called');}
返回{
someFunc:someFunc,
calledFunc:calledFunc
}
}
var obj=新的MyClass();
obj.someFunc();
obj.calledFunc=function(){document.writeln(“未调用原始文件”);}
obj.someFunc();

someFunc
中调用的对象不是被调用的对象

您正在替换
obj.calledFunc
引用的内容,但在
someFunc
中,您正在调用
MyClass
闭包中定义的内容

您必须执行以下操作:

函数MyClass(){
var self=这个;
this.calledFunc=函数(){
书面文件(“原名”);
};
this.someFunc=函数(){
self.calledFunc();//这是指您公开的同一个函数
};
}
var obj=新的MyClass();
obj.someFunc();
obj.calledFunc=函数(){
书面文件(“非原名”);
}

obj.someFunc()
someFunc
中调用的对象不是
obj.calledFunc

您正在替换
obj.calledFunc
引用的内容,但在
someFunc
中,您正在调用
MyClass
闭包中定义的内容

您必须执行以下操作:

函数MyClass(){
var self=这个;
this.calledFunc=函数(){
书面文件(“原名”);
};
this.someFunc=函数(){
self.calledFunc();//这是指您公开的同一个函数
};
}
var obj=新的MyClass();
obj.someFunc();
obj.calledFunc=函数(){
书面文件(“非原名”);
}

obj.someFunc()您不应该(通过构造函数)直接在实例化对象中定义方法,因为在每个新实例上,您都会在内存中获得一个新副本。使用JavaScript的原型概念。可以在对象中重写原型的方法。它将通过从内部调用
obj.myFunction()
this.myFunction()
来调用。如果在实例中找不到它,将在原型链中查找它。可以在一个链中构建多个原型,因此可以构建继承模型。使用
Object.defineProperties
方法时,还可以控制属性(方法也是可执行属性)是否可写以及其他设置

您在示例和其他一些答案中尝试的不是重写,而是重写方法。覆盖时,原始方法将丢失

MyClassPrototype={};
Object.defineProperties(MyClassPrototype,
{
“someFunc”:
{
值:函数()
{
这个函数名为.calledFunc();
}
},
“calledFunc”:
{
值:函数()
{
document.writeln('orig called
\n'); }, 可写:对 } }); 函数MyClass() { } MyClass.prototype=MyClassPrototype; var obj=新的MyClass(); obj.someFunc(); obj.calledFunc=函数() { 文件。书面形式(“非原名和…”); //使用适当的上下文调用原始方法(实例化对象) Object.getPrototypeOf(this.calledFunc.call(this); } obj.someFunc()

滴度

您不应该直接在实例化对象中定义方法(通过构造函数),因为在每个新实例上,内存中都会有一个新副本。使用JavaScript的原型概念。可以在对象中重写原型的方法。它将通过从内部调用
obj.myFunction()
this.myFunction()
来调用。如果在实例中找不到它,将在原型链中查找它。可以在一个链中构建多个原型,因此可以构建继承模型。使用
Object.defineProperties
方法时,还可以控制属性(方法也是可执行属性)是否可写以及其他设置

您在示例和其他一些答案中尝试的不是重写,而是重写方法。覆盖时,原始方法将丢失

MyClassPrototype={};
Object.defineProperties(MyClassPrototype,
{
“someFunc”:
{
值:函数()
{
这个函数名为.calledFunc();
}
},
“calledFunc”:
{
值:函数()
{
document.writeln('orig called
\n'); }, 可写:对 } }); 函数MyClass() { } MyClass.prototype=MyClassPrototype; var obj