【问题标题】:With javascript, how can an object derive from another object, while base objects can be called independently?使用javascript,一个对象如何从另一个对象派生,而基础对象可以独立调用?
【发布时间】:2013-01-03 15:53:41
【问题描述】:

例如:

object1 = function() {
  console.log('action1');
}

object2 = function() {
  console.log('action2');
}

object1(); //should log "action1"
object2(); //I need this to log "action1" and "action2"

我还需要 object2 能够覆盖 object1 的方法,所以上面的方法远非如此(不包含方法);

以下是我想到但我并不在寻找的解决方案:

object2 =     object2 = function() {
  object1(); //this won't allow me to override object1's methods. THIS IS IMPORTANT!!
  console.log('action2');
}

这里尝试只构建和使用蓝图(原型):

object1 = function() {};
object1.prototype.action1 = function() {
  console.log('action1');
}

object2 = function() {};

object2.prototype = new object1();
object2.prototype.constructor = object2;

//object2.prototype.action1 = function() { //I can overwrite the inherited action here
//  console.log('actionCHANGED');
//}
object2.prototype.action2 = function() {
  console.log('action2');
}

var foo = new object2(); //new object1(); will do object1's actions instead, as desired.

for (var method in foo) { //run all of foo's methods
foo[method]();
}

但这也不起作用。它通常会乱序运行功能(原因很明显。)

我尝试了其他一些扩展方法,但始终没有得到我想要的东西。我现在想不出这个例子,但是其他方法之一使 object2 完全按照我的意愿行事,但 object1 只有一个原型函数,因此“new object1()”没有导致任何事情发生。将函数移动到 object1 的实际函数会导致它的动作在 object2 从它继承时运行,这在这种情况下也不好。

我的整个方法可能需要改变。我对想法持开放态度。这样做的实际目的是我正在重新编写我杂乱无章的程序风格的 youtube 插件。我希望能够轻松调用它并改变它的工作方式。

$('selector').youtubePlayer({type:'basic'}) //like object1
$('selector').youtubePlayer({type:'withThumbs'}) //like object2
$('selector').youtubePlayer({type:'allFeatures'}) //even more complex object

但是 jQuery 并不是这里重要的细节……它需要在没有它的情况下简单地工作。喜欢:

youtubePlayer(selector, type);

new youtubePlayer(selector, type);

所以...我们有它。请帮助(并原谅)我的无知。我一直在努力学习这一点。谢谢!

编辑: 这正是我正在做的。

现实生活中的例子: object1(或函数 1)有 2 个方法(函数)。 object1 的第一个功能是将 div 附加到选择器。 object1 的第二个功能是加载 youtube api。当 api 加载时,youtube 播放器将加载到上面的 div 中。

object2 有 2 个方法。 object2 的第一个功能是尽可能从缓存中获取 youtube 播放列表提要,否则从 youtube 获取提要并将其保存到缓存中。 object2 的第二个功能是显示提要中的缩略图

object3 以同样的方式具有更多的功能,并且完全依赖于 object2 的函数在 object3 之前运行。

如果我只想要对象 1 的动作,我只想写“object1();”或 "new object1(); 等每个对象。

【问题讨论】:

  • 我认为你必须提供一个更好的例子。我很难理解您的实际问题。

标签: javascript oop inheritance


【解决方案1】:

我不确定,但是你只是想在覆盖方法中调用object1action1方法吗?

object2.prototype.action1 = function() {
  object1.prototype.action1.call(this);
  console.log('actionCHANGED');
}

【讨论】:

  • 我可能完全误解了你的回答,但我认为这对我没有任何帮助。
  • 我编辑了我的帖子以包含有关我的项目的更多详细信息。 Lee 的回应可能会奏效,但我也很高兴听到您的想法!
【解决方案2】:

我使用了这个代码,Inheritance Manager,它非常适合我当前的项目。

我尝试过其他解决方案,但似乎没有一个提供调用基类代码和覆盖方法等的能力。

网站上的代码应该简单明了。如果您需要更多示例,请告诉我。

这是我得到的版本,已重命名以适合我的项目风格:

_inheritanceManager = {};
_inheritanceManager.extend = function(subClass, baseClass) 
{
    function inheritance() { }
    inheritance.prototype = baseClass.prototype;
    subClass.prototype = new inheritance();
    subClass.prototype.constructor = subClass;
    subClass.baseConstructor = baseClass;
    subClass.superClass = baseClass.prototype;
}

【讨论】:

  • @m59 不用担心。查看示例,然后让我知道是否有任何不清楚的地方。我必须玩到开心为止。
  • 该示例与我尝试过的非常相似。我在这段代码中注意到了我的问题:pastebin.com/3t7A6st8
  • @m59 我不确定我是否遵循您想要实现的目标。您可以完全覆盖您的构造函数,仅调用基本构造函数,或两者的组合。如果您想更改日志记录的顺序(在您的示例中),那么您需要将日志记录拆分为函数或将参数发送到构造函数以指示要调用哪些日志等。但是没有具体示例您正在努力实现,很难知道该建议什么。问候。
  • 我有一个有效的解决方案。我很想听听您对下面我的回答的看法!
【解决方案3】:

您可以简单地使用直接原型继承。

创建类定义A:

function A() {}
A.prototype.action = function() {
  console.log('A::action');
}

创建一个类定义B,它继承自A:

function B() {}
B.prototype = new A();
B.prototype.constructor = B;
B.prototype.action = function() {
  B.prototype.action.call(this);
  console.log('B::action');
}

然后创建适当的实例:

var a = new A();
var b = new B();

a.action(); // A::action
b.action(); // A::action, B::action

当然,您可以改用轻量级继承模型库 Fiber.js,在 https://github.com/linkedin/Fiber,它为您抽象了继承的所有引导

var A = Fiber.extend(function() {
  return {
    action: function() {
      console.log('A::action');
    }
  }
});

var B = A.extend(function(base) {
  return {
    action: function() {
      base.action.call(this);
      console.log('B::action');
    }
  }
});

var a = new A();
var b = new B();

a.action(); // A::action
b.action(); // A::action, B::action

【讨论】:

    【解决方案4】:

    已经有一段时间了,我学到了很多关于继承的知识,并且熟悉了几种模式。我想我会分享以防它对某人有所帮助。下面是我正在寻找的模式。这是一篇解释它的文章:http://blog.javascriptroom.com/2013/01/21/the-initializer-pattern/

    要查看它的实际效果,请单击此处:http://jsbin.com/orijaz/2/edit

    var foo = {
      run: function() {
        this.action1();
        this.action2();
      },
      action1: function() {
        console.log('action1 '+this.objName);
      },
      action2: function() {
        console.log('action2 '+this.objName);
      },
      objName: 'foo'
    };
    
    var bar = Object.create(foo);
    bar.run = function() {
      this.first();
      foo.run.call(this);
      this.last();
    };
    bar.first = function() {
      console.log('first '+this.objName);
    };
    bar.last = function() {
      console.log('last '+this.objName);
    };
    bar.objName = 'bar';
    
    foo.run();
    bar.run();
    

    旧答案:

    var object1 = function() {};
    //NEW METHODS
      object1.prototype.action1 = function () { console.log('action1'); };
      object1.prototype.action2 = function () { console.log('action2'); };
    
      object1.prototype.run = function() {
        this.action1();
        this.action2();
      };
    
    var object2 = function() {};
      //INHERIT
      object2.prototype = new object1();
      //MODIFY METHODS
      object2.prototype.action2 = function() {
        console.log('action2 changed!!'); 
      };
      //NEW METHODS
      object2.prototype.action3 = function () { console.log('action3'); };
    
      object2.prototype.run = function() {
        object1.prototype.run.call(this);
        this.action3();
      };
    
    object1.prototype.run(); //I do the basic 2 actions
    object2.prototype.run(); //I do the basic 2 actions with any changes made, then my own new actions
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      • 2013-09-28
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多