首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Javascript :如何覆盖和包装父对象的方法?

Javascript :如何覆盖和包装父对象的方法?
EN

Stack Overflow用户
提问于 2013-12-24 08:21:10
回答 5查看 1.2K关注 0票数 2

我的意愿

  • 使用带有方法o的对象work
  • o.work()前打印"Hello“
  • o.work()后打印“再见”
  • o.work()将由第三方召集

我的尝试

代码语言:javascript
运行
复制
// sample library object
var o = {
     score: 5,
     work: function() {
                     console.log(this.score);
                }
};

// my code
var cons = function () {
     this.score = 10;
     this.work = function () {
          console. log("Hello");
           // how to call parent's work() ?
           // if I do this.prototype.work() -> prints 5
           // But parent's work should be called when this.score is 10
          console. log("Bye");
     };
 };
 cons.prototype = o;
 my_o = new cons();

 // my_o will be passed to 3rd party instead of o

In

  • 我正在尝试装饰继承的方法。
  • 超级很简单,但JavaScript没有超级

他们说原型遗传是超亲的。

更新

  • work()使用this.score,它在继承后被重写。

更新2

  • 期望是o.work()应该打印5
  • 期望是my_o.work()应该打印10
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-12-24 09:24:17

弄明白了:

代码语言:javascript
运行
复制
// sample library object
var o = {
     score: 5,
     work: function() {
                     console.log(this.score);
                }
};

// my code
var cons = function () {
     this.score = 10;
     this.parent = arguments.callee.prototype;
     this.work = function () {
          console. log("Hello");
           // this.prototype.work() // Doesn't work since 'this' is an object
           // objects don't contain a link to prototype.
           // ###### With direct reference to `cons` ###### //
           // cons.prototype.work(); // (No Context) -> prints 5
                    // OR
           cons.prototype.work.call(this); // (With 'this' context) -> prints 10
           // ###### Without direct reference to `cons` [ Preferred ] ###### //
           // this.parent.work(); // (No Context) -> prints 5
                    // OR
           this.parent.work.call(this); // (With 'this' context) -> prints 10
          console. log("Bye");
     };
 };
 cons.prototype = o;
 my_o = new cons();

 my_o.work();

期望值达到

  • o.work()打印5
  • my_o.work()打印10
票数 0
EN

Stack Overflow用户

发布于 2013-12-24 08:36:31

有点丑,但你可以打电话给cons.prototype.work;

代码语言:javascript
运行
复制
var Cons = function () {
     this.work = function () {
         alert('Hello');
         cons.prototype.work.call(this); // <= here
         alert('Bye');
     };
 };

或者更一般的:

代码语言:javascript
运行
复制
var Cons = function () {
     this.parentwork = arguments.callee.prototype.work;
     this.work = function () {
         alert('Hello');
         this.parentwork.call(this);
         alert('Bye');
     };
};

参见此jsFiddle

票数 2
EN

Stack Overflow用户

发布于 2013-12-24 08:27:27

您需要确切地知道要调用的父程序是谁,并直接调用它(使用this方法传递本地.call值),或者需要使用OOP库来实现这些功能,而代价是需要非常复杂的代码设计。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20757377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档