javascript - 使用javascript,一个对象如何从另一个对象派生,而基础对象可以独立调用?

标签 javascript oop inheritance

例如:

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');
}

这是仅构建和利用蓝图(原型(prototype))的尝试:

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 只有一个原型(prototype)函数,因此“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 的第二个功能是显示 feed 中的缩略图

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

如果我只想要对象 1 的操作,我只想写“object1();”或“new object1(); 对于每个对象依此类推。

最佳答案

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

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

关于javascript - 使用javascript,一个对象如何从另一个对象派生,而基础对象可以独立调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14142363/

相关文章:

javascript - 有什么方法可以从查看器中的 Revit 文档中读取实体(架构)吗?

javascript - jQuery 表中的表长度

类中的 PHP 调用函数 - 有更简单的方法吗?

javascript - 如果 Javascript 的原生 OOP 是无类的,那么构造函数呢?这不是意味着一个类吗?

javascript - 使用上传的 XML 文件填充 HTML5 输入字段

javascript - React-Native 使用多个模块来构建应用程序

c++ - 有没有办法根据派生类的可能性值范围来限制对象参数?

Java:强制基类使用基类方法而不是重写方法

c++ - 覆盖基类调用的函数?

Scala:用 val 覆盖 def