如何在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