我试过这个没有成功:
<!DOCTYPE html>
<html>
<title>Web Page Design</title>
<head>
<script>
function MyClass() {
function someFunc() { calledFunc(); }
function calledFunc() { document.writeln('orig called'); }
return {
someFunc: someFunc,
calledFunc: calledFunc
}
}
var obj = new MyClass();
obj.someFunc();
obj.calledFunc = function() { document.writeln("not orig called"); }
obj.someFunc();
</script>
</head>
<body>
</body>
</html>
我发现只调用了orig called
而不是not orig called
我如何覆盖calledFunc
以便调用not orig called
?
答案 0 :(得分:2)
您必须在调用this.
方法之前添加calledFunc
,否则您将引用私有function calledFunc()
:
<!DOCTYPE html>
<html>
<title>Web Page Design</title>
<head>
<script>
function MyClass() {
function someFunc() { this.calledFunc(); }
function calledFunc() { document.writeln('orig called'); }
return {
someFunc: someFunc,
calledFunc: calledFunc
}
}
var obj = new MyClass();
obj.someFunc();
obj.calledFunc = function() { document.writeln("not orig called"); }
obj.someFunc();
</script>
</head>
<body>
</body>
</html>
答案 1 :(得分:1)
obj.calledFunc
不是您在someFunc
内调用的那个。
您正在替换obj.calledFunc
引用的内容,但在someFunc
中,您正在调用MyClass
闭包中定义的内容。
您必须执行以下操作:
function MyClass() {
var self = this;
this.calledFunc = function() {
document.writeln('orig called');
};
this.someFunc = function() {
self.calledFunc(); // This refers to the same function you've exposed
};
}
var obj = new MyClass();
obj.someFunc();
obj.calledFunc = function() {
document.writeln("not orig called");
}
obj.someFunc();
答案 2 :(得分:1)
您不应直接在实例化对象中(通过构造函数)定义方法,因为在每个新实例上,您都会在内存中获得新副本。使用JavaScript的原型概念。您可以覆盖对象中的原型方法。它将通过从内部调用obj.myFunction()
或this.myFunction()
来调用。如果在实例中找不到它,它将在原型链中查找。您可以在链中构建多个原型,因此您可以构建继承模型。当您使用Object.defineProperties
方法时,您还可以控制属性(方法是否也是可执行属性)是否可写以及其他设置。
您在示例中尝试的内容以及其他一些答案说明,不是覆盖,而是覆盖方法。当覆盖时,原始方法将丢失。
MyClassPrototype = {};
Object.defineProperties(MyClassPrototype,
{
'someFunc':
{
value: function()
{
this.calledFunc();
}
},
'calledFunc':
{
value: function()
{
document.writeln('orig called<br>\n');
},
writable: true
}
});
function MyClass()
{
}
MyClass.prototype = MyClassPrototype;
var obj = new MyClass();
obj.someFunc();
obj.calledFunc = function()
{
document.writeln("not orig called AND...");
// call original method with proper this-context (instantiated object)
Object.getPrototypeOf(this).calledFunc.call(this);
}
obj.someFunc();
&#13;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titel</title>
</head>
<body>
</body>
</html>
&#13;